avatar
文章
165
标签
111
分类
5

首页
分类
友链
说说
Doraemon's Blog
搜索
首页
分类
友链
说说

Doraemon's Blog

十字链表存储稀疏矩阵
发表于2020-12-03|算法|数据结构
课程设计 问题描述: 用十字链表存储稀疏矩阵,实现两个可进行矩阵之间的乘法运算。  基本要求: (1)要对两个矩阵能否进行乘法进行判断。(2)对能够进行乘法运算的稀疏矩阵进行乘法运算并输出正确的结果。 参考博客 大致思路一般矩阵中会有很多值为0的元素,十字链表把这些值给忽略掉了,只存有值不为0的元素,每一行都是一个链表,每一列也是一个链表,用一个行指针、一个列指针指向它们,形成矩阵形式 数据类型123456789typedef struct OLNode{ //元素类型 int row,col; //行列 ElemType val; //数值 OLNode *right,*down; //行指针、列指针}*OLink; struct CrossList{ //矩阵结构 int n,m,num; OLink *Rhead,*Chead; //指向行链表、列链表的指针}; 初始化指针每次都要先把矩阵指针置为空 1234void InitCrossList(CrossList &CL){ CL.n=CL.m=CL ...
Binary Tree
发表于2020-11-30|算法|数据结构
实验目标:1、创建二叉树2、用非递归算法先中后序遍历二叉树 (难点)3、分别求出二叉树中度为 0、1、2的结点个数4、求出树的高度 参考博客:Article_1Article_2 难点在于非递归遍历,用栈来模拟递归的过程 二叉树结构1234typedef struct node{ char data; struct node *lchild, *rchild;}BiTNode,*BiTree; 创建二叉树12345678910void CreateBiTree(BiTree &t){ char ch; cin>>ch; if(ch=='#') t=NULL; else{ t=new node; t->data=ch; CreateBiTree(t->lchild); //创建左子树 CreateBiTree(t->rchild); //创建右子树 }} 层序遍历1234567891011121314void Level(BiTree L){ ...
倍增与tarjan求解lca
发表于2020-11-23|算法|tarjan
倍增 以倍增方式向上跳,时间复杂度是O(q*logn) tarjan 树上算法,实现过程通过dfs+并查集来离线求出lca(最近公共祖先),时间复杂度O(n+q),n是结点数,q是查询数 算法实现过程倍增算法流程: 用一个dfs得出每一个点的父亲节点还有它的深度,用数组保存起来,其中保存父亲的数组用dp[i][j]表示,意义是i节点向上跳2^j^步后到达的节点,父亲节点保存在dp[i][0]中 12345678void dfs(int u,int fa,int d){ //得到每一个点的深度和父亲节点 dp[u][0]=fa; dep[u]=d; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(v!=fa) dfs(v,u,d+1); }} 然后倍增预处理出每一个节点向上跳2^i^步到的的节点 1234567void bz(){ //预处理 for(int i=1;i<=22;i++){ for(int u=1;u<=n;u++){ ...
KMP
发表于2020-11-05|算法|KMP
暑假学习了KMP,奈何掌握不深,现在又来复习,结果又是从零开始 什么是KMP?现在有一个原字符串,再给你一段模式串,问你在原字符串中是否存在一段子串等于模式串,或者模式串在原串中出现几次? BF算法,也就是人人都会的指针回朔暴力算法,略过 原串: ABABABAABA (i) 模式串: ABAA (j) 当匹配时第一个失配的位置是3(下标从0开始),然后朴素做法是把i和j指针都回朔,但其实可以利用之前已经匹配的信息的,可以找到当前失配字符之前的最大公共前后缀长度,假设长度为k,则s[i-k]…s[i-1]==t[j-k]…t[j-1],而t[0]…t[k-1]==t[j-k]…t[j-1],所以s[i-k]..s[i-1]==t[0]…t[k-1],所以只需要把j移到k位置就可以了,i指针不回朔,这样一来就只要j指针回朔,而且大概率没有回朔到0,省去大量时间,那么问题就来了,怎么找到模式串中每一个位置的k呢? 前面已经说了,k是每一个位置之前字符串(不包括k位置)的最长公共前后缀长度,而公共前后缀与原串无关,只是在模式串中求即可 求解NEXT用next[i]表示i位置之前字符串的 ...
CCPC打铁记
发表于2020-10-22|生活|竞赛
2020年10月18日,这一天是我第一次打比赛的日子,非常有纪念意义,但是时至今日我才补了这篇文章 2020年注定是不平凡的一年,突如其来的疫情改变很多人的生活轨迹,原本该在这一年大展拳脚的学长们无奈只能在家里打着练习赛,然而对我们而言,有好也有坏吧,好的是我们有更多时间去提升自己(当然全靠自觉),坏的是少了许多阅历,不管怎样,终于在2020年8月29日我们开学了,开学后经过一个星期的过渡,又回到了算法的训练中去,在下面也打了许多训练赛,每次都紧紧抱着大佬的大腿,每次成绩也都还不错(不错指的是会的都比较快的做出来了),然而只要是dp只要是新算法我们就止步于此了 又过了一个月,我们迎来的这一年的CCPC邀请赛,首先是出线问题,最终学长们也都打进去了,我们19级的因为时间还多,机会就都留给学长们了,不过一星期后,老师跟我们说可以办外卡,也可以参赛拿奖,高兴了我一天,当时我以为是线下赛,想着终于可以出去涨涨见识了,然而第二天就丧了,因为疫情,这一年几乎所有比赛都是线上举行的!一下子感觉气氛都不对了,不过毕竟是比赛,比赛前我还是有去多刷题的,然而因为好多新算法都没学,有很多题目都是干瞪眼 ...
LCA最小公共祖先
发表于2020-09-29|算法|算法
LCA 公共祖先什么是最小公共祖先,顾名思义就是俩点最近的公共祖先 如图所示: 2和5的最小公共祖先就是4 2和1的最小公共祖先就是4 3和5的最小公共祖先是1 那么怎么求呢? 先介绍两种朴素的做法,也就是超时的做法🐷 第一种: 向上标记法 想求两个点的最小公共祖先可以先从其中一个点往上找父亲结点,直到根节点,把路径标记一下,然后从另一个点开始做同样的操作,当遇到已经标记过的点的时候就停下来,这个点一定是最小公共祖先( 每次查询时间复杂度:O(n) ) CODE12345678910111213141516171819202122232425262728293031323334353637383940414243#include <bits/stdc++.h>using namespace std;const int MAXN=500100;vector<int> vt[MAXN];int fa[MAXN];bool vis[MAXN];void dfs(int u){ int len=vt[u].size(); for(int i=0;i&l ...
博弈论
发表于2020-09-24|算法|博弈论
注意注意注意: 异或运算符优先级比等于还要低!!!!二进制的运算符尽量都加上括号 必胜状态后继节点一定有必败 必败状态后继都是必胜 巴什博弈 数上博弈俩人轮流取数,一次可以取走1到m个数,假如有m+1个数,则第一个人怎么取第二个人都可以一次取走,第二个人就赢了,现在有x个数,这x个数可能是m+1的倍数,也可能不是,假设不是,那么那么第一个人就可以第一次取s个数,把m+1这个必败状态给对方,假如是,则自己就是必败了x=n*(m+1)+s Brave game (HDU1846)1234567891011121314#include <bits/stdc++.h>using namespace std;int main(){ int t; cin>>t; while(t--){ int a,b; cin>>a>>b; int mod=a%(b+1); if(mod>=1) cout<<"first"< ...
Millionaire Madness
发表于2020-09-11|题目|BFS
计蒜客之前比赛的一道题目,记录一下 G Millionaire Madness A close friend of yours, a duck with financial problems, has requested your help with a matter that will help him pay off his debts. He is the nephew of an extremely wealthy duck, who has a large vault, filled with mountains of coins. This wealthy duck has a certain coin in his possession which has a lot of sentimental value to him. Usually, it is kept under a protective glass dome on a velvet cushion.However, during a recent relocating of the coins in t ...
python_arrange
发表于2020-09-03|python
写这个代码花了一个小时,因为刚学了一点点OS模块,还不是很熟悉,写完后功能也都有,但是!!!导出为exe文件时不小心误删了py文件,气死我了!又重新写了一遍。 新加了GUI界面的整理页面小程序,效果如下图所示 GitHub项目地址 Here 效果图: {height=”400”,width=”400”} CODE1(不含有重命名)12345678910111213141516171819202122232425262728293031323334353637383940414243444546import osfrom shutil import copyfiledef create(): print('------创建文件夹------') for i in var_list: Path_now = os.path.join(Path, i).replace('\\', '/') if(not os.path.exists(Path_now)): os.m ...
浅谈哈希
发表于2020-08-16|算法|集训
前言 趁着还没忘记录一下吧🐷 哈希能干些啥?学一个新算法首先一定要知道学这个能干些啥对吧,我们是为了用某个东西而去学这个东西而不是盲目目的的学,现在假如给你两段字符串让你去比较他们是否相同,如果暴力做法就是从头到尾扫一遍,都相同则相同,复杂度为O(N),假如数据量非常大,而且字符串长度很大,现在题目就变成了给你n个字符串,现在又给你t个字符串问你每一个字符串是否在这n个字符串中,平常做法时间复杂度O(tt个字符串每一个字符串长度\n),若用哈希预处理时间复杂度降到O(t*字符串长度+n),也就是把那n个字符串预先处理一下,使得接下来比较每一个字符串时时间复杂度变成O(1),让我们来看一下具体怎么操作吧 思想其实哈希和二进制思想是类似的,如果让你比较两个二进制串是否相同,你肯定会想到把二进制转成十进制比较起来会更方便,因为复杂度降低到了O(1),不用你去逐位比较了,那字符串也是可以像二进制那样转换成为一个数字的,例如:abcd这个字符串可以转换成为ap^3^+b\p^2^+c*p^1^+d*p^0^,这里的p值是多少先不说,每一个字符都是有acall值的,我们可以直接利用这一点把每 ...
1…111213…17
avatar
Doraemon
记录成长经历
文章
165
标签
111
分类
5
Follow Me
公告
纵岁月在笔尖洇开深浅,初心始终是砚台上那方不涸的墨。
最新文章
进程上下文到底是什么东西?
进程上下文到底是什么东西?2025-10-02
协程食用指南
协程食用指南2025-10-01
利用 Redis 实现分布式锁
利用 Redis 实现分布式锁2025-09-27
分布式 ID 的生成方案
分布式 ID 的生成方案2025-09-20
分布式事务
分布式事务2025-09-19
最新评论
正在加载中...
分类
  • 技术8
  • 生活5
  • 算法88
  • 记录23
  • 题目36
标签
win10 kmeans 种类并查集 雪花算法 小游戏 可持续化并查集 线性回归 随笔 异或题 状压+前缀异或和 2020 bitset优化 DFS NIO GC 考研 题目 BIO 分组背包 笔试 爬虫 基础数学 遗传算法 背包 dfs 内核 倍增 sql语法 字典树 离散化差分 KMP 矩阵快速幂 三分 单调栈 UUID 刷题日记 CSS tarjan 算法 纪念我的ACM史
归档
  • 十月 20252
  • 九月 20255
  • 三月 20252
  • 二月 20255
  • 一月 20251
  • 九月 20243
  • 八月 20242
  • 七月 20242
网站资讯
文章数目 :
165
已运行时间 :
本站总字数 :
257.7k
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2025 By Doraemon
框架 Hexo|主题 Butterfly
Hi, welcome to my blog!
搜索
数据库加载中