算法
文章平均质量分 58
soyisou
码农,砖家,斜杠青年
展开
-
并查集及应用
并查集用途1. 将两个集合合并2. 询问两个元素是否在一个集合当中基本原理每个集合用一棵树来表示,树根的编号就是整个集合的编号每个节点存储它的父节点,p[x]表示x的父节点主要问题1. 如何判断树根: if(p[x] == x) 则为树根;2. 如何求x的集合编号:while(p[x] != x) x = p[x];核心函数int find(int x){//返回x的祖宗结点 + 路径压缩 if(p[x] != x) p[x] = find(p[x]); return p[原创 2021-08-18 18:05:12 · 102 阅读 · 0 评论 -
手写堆操作
手写堆操作1. 插入一个数: heap[++ size] = x, up(size)2. 求集合当中的最小值, heap[1]3. 删除最小值, heap[1] = heap[size], size --, down(1)4. 删除任意元素, heap[k] = heap[size], size --, down(k), up(k)5. 修改任意元素, heap[k] = x, down(k), up(x)基本操作void down(int u){ int t = u; if(原创 2021-08-18 18:03:21 · 84 阅读 · 0 评论 -
二分法总结
二分法小结:思想:在一个区间进行二分,每次都要选择答案所在的区间进行处理,亦即每次的区间都会把答案覆盖掉,每一次都能保证我们的区间有答案。二分的时候我们一定会保证这个区间是有答案的,那么当区间长度是1时,这个区间里的数就是答案。二分和单调性的关系:有单调性的一定可以二分,但可以二分的不一定有单调性,即没有单调性也可以二分。二分和题解的关系:我们二分的时候一定是有解的。如果是无解,和题目是有关的,而与二分模板无关。无解并不是在二分中是无解,而是我们二分完后通过这个性质可以判断出原问题无解。原创 2021-08-18 17:58:53 · 391 阅读 · 0 评论 -
反转链表(有无、头指针小结)
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000无头结点(两种方式)C ++ 代码1/** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2021-08-18 17:34:08 · 99 阅读 · 0 评论 -
数据结构面试精华整理(考研、保研和工作)
数据结构面试精华整理(考研、保研和工作),全程干货,没有半句废话!原创 2021-08-18 10:37:20 · 1902 阅读 · 0 评论 -
STL 的sort函数常用案例
重载小于号的两种方法方法1:struct Sum{ int s, c, d; // s表示c和d的平方 bool operator<(const Sum& t) const //返回较小的那个 { if(s != t.s) return s < t.s; if(c != t.c) return c < t.c; return d < t.d; }} sum[N];sort(sum, s原创 2021-08-11 00:38:56 · 195 阅读 · 0 评论 -
哈希表小结
哈希表存储结构:1. 开放寻址法2. 拉链法字符串哈希用途利用字符串前缀哈希方法快速判断同一个字符串两个不同区间的字符串是否相等.如果hash值相等则认为两个区间的字符串相同,否则不相等时间复杂度O(1)O(1)O(1)主要步骤step1: 把字符串看成P进制数**step2:**预处理字符串所有的前缀hash值, hash[i] = (hash[i - 1] * P + str[i]) mod Q**step3: **计算区间hash值hash[l, r] = hash[r] - h原创 2021-08-11 00:38:15 · 103 阅读 · 0 评论 -
高精度小结
1. 高精度加法// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ vector<int> C; int t = 0;//表示进位位 for(int i = 0; i < A.size() || i < B.size(); i ++){ if(i < A.size())原创 2021-08-11 00:37:20 · 86 阅读 · 0 评论 -
常见数论知识小结
1. 质数的判断质数:在大于1的整数中,如果只包含1和它本身这两个约数,就被成为质数,或者叫素数.如果 d | n, 则(n / d) | n. ------ 可以发现n的所有约数都是成双成对出现的.质数定理: 1 - n中有n / lnn 个质数.调和级数: 1 + 1 / 2 + 1 / 3 + 1 / 4 + ··· = lnn + C(0.577)1.朴素做法 ---- O(n)O(n)O(n)bool is_prime(int n){ if(n < 2) return原创 2021-08-11 00:36:42 · 310 阅读 · 0 评论 -
双指针算法
双指针算法使用 i, j 两个变量,不会退的扫描一个或两个数组朴素做法 — O(n2)O(n ^ 2)O(n2)for(int i = 0; i < n; i ++){ for(int j = 0; j < n; j ++)}双指针算法 ---- O(n)O(n)O(n)for(int i=0,j=0;i<n;i++){ while(j<i && check(i,j)) j++; //每道题目的具体逻辑}核心思想将朴素做原创 2021-08-11 00:36:05 · 67 阅读 · 0 评论 -
算法中常用STL总结
-------------------------------------------STL常用用法小结---------------------------------注: size()、empty()是所有容器都有的,时间复杂度为 O(1),并不是结果并非遍历得到,而是原本就有个变``````量来存size,直接访问该变量即可注:系统为某一程序分配空间时,所需时间与空间大小无关,而是与申请次数有关---倍增思想的原理vector 变长数组,倍增的思想 size() 返回元素个数 e原创 2021-08-10 17:58:25 · 112 阅读 · 0 评论 -
史上超全内部排序大汇总
排序算法目录直接插入排序折半插入排序希尔排序冒泡排序快速排序选择排序归并排序堆排序1. 直接插入排序直接插入排序算法思想将序列分为有序部分和无序部分,从无序部分中依次选择元素,与有序部分进行比较,找到合适的位置,将原来的元素后移,将元素插入到相应的位置,直到全部记录插入完成。动画演示时间复杂度最好 — O(n)O(n)O(n) 序列有序最坏 — O(n2)O(n^2)O(n2) 序列逆序平均 — O(n2)O(n^2)O(n2)空间复杂度 O(1)原创 2021-08-10 15:45:35 · 2361 阅读 · 3 评论 -
归并排序 - 数据结构 - 算法
算法思想将两个或多个有序序列合并为一个有序序列注:二叉树的第 h 层最多有 $ 2^{h-1} $ 个结点,若树高为 h ,则应该满足 $ n <= 2^{ h-1} $ , 即 $ h - 1 = \lceil log{_2}n\rceil $, 即趟数 = $ \lceil log{_2}n\rceil $每趟归并时间复杂度为 $ O(n) $ ,则算法时间复杂度为 $ O(nlogn) $空间复杂度为 $ O(n) $ ,来自于辅助数组时间复杂度最好 — O(nlogn)O(原创 2021-08-10 12:38:55 · 323 阅读 · 0 评论 -
堆排序 - 数据结构 - 算法
算法思想每一趟将堆顶元素加入到有序子序列(与待排元序列中的最后一个元素交换),并将待排序列再次调整为大根堆(即将小元素 “下坠” )。注:1. 基于 “大根堆” 的堆排序得到的是递增序列2. 一个结点每“下坠”一层,最多只需要比对关键字两次3. 若树高为h,某结点在第i层,将这个结点向下调整最多只需要“下坠”h - i层,关键字的比对次数不超过2(h - i)4. n个结点的完全二叉树,树高 h = $\lfloor log{_2}n \rfloor $ + 1时间复杂度最好 — O(n原创 2021-08-10 12:37:11 · 1317 阅读 · 0 评论 -
选择排序 - 数据结构 - 算法
算法思想每一趟在待排元素中选取关键字最小的元素加入到有序序列注:简单选择排序与序列的初始状态无关,仅与序列的元素个数有关时间复杂度最好 — O(n2)O(n^2)O(n2)最坏 — O(n2)O(n^2)O(n2)平均 — O(n2)O(n^2)O(n2)演示动画空间复杂度仅用一个临时变量 min — O(1)O(1)O(1)稳定性不稳定适用性顺序表链表算法特点不稳定,但改变策略可以写出不产生“不稳定现象”的选择排序算法可用于链式存储结构移动次数较少,当每一原创 2021-08-10 12:35:50 · 304 阅读 · 0 评论 -
快速排序 - 数据结构 -算法
算法思想在待排序表 a[0...n-1]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两个部分a[0...k-1]和a[k + 1 ...n-1],使得a[0...k-1]中的所有元素均小于pivot,a[k + 1...n - 1]中所有元素均大于等于pivot,则pivot放在其最终的位置a[k]上,这一过程成为一次“划分”,然后分别递归地对两个子表重复上述过程,直到每一部分内只有一个元素或空为止,即所有元素放在了其最终的位置上。时间复杂度最好 —原创 2021-08-10 12:34:18 · 271 阅读 · 0 评论 -
冒泡排序 - 数据结构 - 算法
算法思想从前往后(或从后往前)两两比较相邻元素的值,若为逆序则交换它们,直到序列比较完为止,称这样的过程为一趟冒泡排序,进行n-1趟冒泡排序即可完成排序。注:1. 每一趟排序都可以使一个元素移动到最终位置,已确定最终位置的元素在之后的处理中无需再对比2. 如果某一趟排序过程中未发生交换,则算法可提前结束时间复杂度最好 — O(n)O(n)O(n) 有序序列最坏 — O(n2)O(n^2)O(n2) 逆序序列平均 — O(n1.3)O(n^ {1.3})O(n1.3)演示原创 2021-08-10 12:32:02 · 126 阅读 · 0 评论 -
希尔排序 - 数据结构 - 算法
算法思想先将序列分为若干个子序列,然后对各个子序列进行直接插入排序,等到序列基本有序时,再对整个序列进行一次直接插入排序。即先追求表中的元素部分有序,再逐渐逼近全局有序。优点:让关键字值小的元素能能够很快移动到前面,且序列基本有序时进行直接插入排序时间效率会提升很多。时间复杂度最好 — O无O无O无最坏 — O(n2)O(n^2)O(n2)平均 — O(n1.3)O(n^1.3)O(n1.3)演示动画空间复杂度 O(1)使用数组头号元素a[0]稳定性不稳定适用性仅适用于顺序原创 2021-08-10 12:16:01 · 312 阅读 · 0 评论 -
折半插入排序 - 数据结构 - 算法
算法思想设置三个变量low,high,mid,令mid = (low + high) / 2,若a[mid] > key, 则令high = mid - 1,否则令low = mid + 1,直到low > hig时停止循环。对序列中的每个元素做以上处理,找到合适位置将其他元素后移,进行插入。时间复杂度最好 — O(nlogn)O(nlogn)O(nlogn)最坏 — O(n2)O(n^2)O(n2)平均 — O(n2)O(n^2)O(n2)####注:比较次数与待排序列的初始装态原创 2021-08-10 12:14:02 · 485 阅读 · 0 评论 -
直接插入排序 - 数据结构 - 算法
算法思想将序列分为有序部分和无序部分,从无序部分中依次选择元素,与有序部分进行比较,找到合适的位置,将原来的元素后移,将元素插入到相应的位置,直到全部记录插入完成。动画演示时间复杂度最好 — O(n)O(n)O(n) 序列有序最坏 — O(n2)O(n^2)O(n2) 序列逆序平均 — O(n2)O(n^2)O(n2)空间复杂度 O(1)不带哨兵用临时变量temp带哨兵用a[0]稳定性稳定适用性顺序表链表算法特点稳定排序算法简易,易实现顺序表、链表原创 2021-08-10 12:10:13 · 128 阅读 · 0 评论