![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
包括简单的数据结构和复杂的数据结构,基础和高级算法也都包括
wekidi
这个作者很懒,什么都没留下…
展开
-
算法 | KMP算法
核心:主串不能回退,一直遍历当子串没有重复的时候子串回退到头部有重复的时候回退到最后一个重复位置如果发生失配,从失配位置向前看,看字串是否存在两个真子串一个顶头一个顶尾匹配到c的时候匹配失败,按照普通方式是子串回到起始位置,主串到上次开始匹配位置的下一个位置,也就是b,但是这样的话在匹配失败的位置c的前面等于发生"错位",这样错位一直到,这时候其实也是错位,但是刚好错位还跟第一次匹配错误位置前两个对应上了,由于并不知道第一次匹配错误的位置是否等于子串的下一个位置,所以需要比较一下b是否和a相等原创 2022-02-27 18:15:00 · 86 阅读 · 0 评论 -
排序 | 堆排序
思路:void adjustheap(int* ar,int start,int end){ int tmp = ar[start]; int i = start; int j = 2 * start + 1;//左孩子 while (j <= end) { if (j<end && ar[j + 1]>ar[j]) { j += 1; } if (ar[j] > tmp)//本来是要把tmp放到这个位置的,可是他如果小于他的孩子原创 2022-02-23 22:47:26 · 119 阅读 · 0 评论 -
排序 | 归并排序(递归和迭代)
利用分治的思想,将问题不断地划分为相同但是规模更小的问题,利用相同的解法解小问题,最终大问题得以解决一一合并完之后每一个元素个数为2的数组有序,然后两个两个的合并,四个四个的合并…直到最大容量,排序完成递归版void copy(int* src, int* dest, int left, int right){ for (left; left <= right; ++left) { dest[left] = src[left]; }}void merge(int* src, i原创 2022-02-20 22:24:30 · 497 阅读 · 0 评论 -
排序 | 快速排序
思想每一次划分,使左边均小于基准,右边均大于,但是无序,然后再将左右边各划分一次,这样划分下去,直到分解数组大小为1,划分停止,此时已经有序.划分函数快排中划分函数时必不可少的,他的作用是确定一个基准,然后以此基准进行划分,划分的方式有很多种,最常用的是双指针在边界处进行遍历,右指针找小于基准的,左指针找大于基准的,然后交换,直到左右指针重合,再把基准放到最终指针位置,这样基准的左边均小,右边均大了.双指针指向最左和最右的划分函数int Partition(int* ar, int left, i原创 2022-02-17 16:55:48 · 375 阅读 · 0 评论 -
算法 | 递归和分治
概念分治策略:是将规模比较大的问题可分割成规模较小的相同问题。问题不变,规模变小。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。递归:若一个函数直接地或间接地调用自己,则称这个函数是递归的函数。(简单地描述为“自己调用自己”)。典型例子:求阶乘int fac(int n){ if(n==1) return 1; return fac(n-1)*n;}int main(){ fac(4);}当求4的阶乘时,进入函数,不满足i原创 2022-02-13 20:19:18 · 786 阅读 · 0 评论 -
算法 | 时间复杂度master 公式
master 公式T(N) = a*T(N/b) + O(N^d)估计递归问题复杂度的通式,只要复杂度符合以下公式,都可以套用此公式计算时间复杂度例子:递归方式查找数组最大值 T(N) = 2*T(N/2) + O(1)T(N):样本量为 N 的情况下,时间复杂度N:父问题的样本量a:子问题发生的次数(父问题被拆分成了几个子问题,不需要考虑递归调用,只考虑单层的父子关系)b:被拆成子问题,子问题的样本量(子问题所需要处理的样本量),比如 N 被拆分成两半,所以子问题样本量为 N...原创 2021-05-31 16:04:58 · 1055 阅读 · 0 评论