数据结构与算法
文章平均质量分 75
数据结构与算法
「已注销」
这个作者很懒,什么都没留下…
展开
-
[数论]——辗转相除法求最大公因数
1. 辗转相除法1.1.算法实现int gcd(int a, int b){ return b == 0?a:gcd(a,a%b);}无论a>b还是b>a都适用。因为,若a<b,那么显然会有a%b=a,也就会出现gcd(a,b)=gcd(b,a)显然成立。1.2.实现流程求a与b的最大公约数:1.3.证明①引理:如果有等式a=k∗b+ra=k*b+ra=k∗b+rr = a%b成立, 那么a与b和a与b(r=a%b)有相同的公因式。②假设d为a原创 2021-03-11 16:15:27 · 1958 阅读 · 0 评论 -
贪心算法
贪心算法一、基本概念:所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。二、贪心算法的基本思路:1.建立数学模型来描述问题。2.把求解的问题分成若转载 2020-06-15 21:23:24 · 181 阅读 · 1 评论 -
贪心思想[个人理解]
贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。 ——百度百科贪心算法:是从局部最优,得到整体最优解的过程。通常用于求解最优问题。贪心算法主要是贪心策略的选择。选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。个人理解是每个状态就是局部, 即每个子局部的最优解不会影响其父局部的最优解。...原创 2020-06-15 21:12:07 · 296 阅读 · 1 评论 -
[模板]——马拉车算法[java]
class Solution { public static char[] preProcess(String s){ int len = s.length(); char[] t = new char[len*2+3]; t[0] = '$'; t[1] = '#'; int j = 2; for(int i = 0;i < len;i++){ t[j原创 2020-06-08 14:40:37 · 132 阅读 · 0 评论 -
[入门1.0]——ST表——离线区间最值查询
ST表ST(实质是动态规划) 是一个用来解决rmq(区间最值)问题的算法ST不支持在线修改, 离线查询预处理时间复杂度O(nlogn), 查询时间为O(1)。构建ST表用mn[i][j]记录 [i, i+2j-1]的最值(长度为2j)因此对于任意mn[i][j] = min(前半段最小值, 后半段最小值),即mn[i][j] = min(mn[i][j-1], mn[i+pow(i,...原创 2020-04-03 17:25:16 · 212 阅读 · 0 评论 -
[]——图论——最短路径——Floyd算法的证明[1.0]
Floyd算法简短介绍思想:Floyd算法考虑的是一条最短路径上的中间结点。什么是中间节点举个例子:一个简单路径p = <v1,v2,v3,…,vl>上的中间结点指的就是除了v1和vl之外的任意节点, 也就是处于集合<v2,v3,…,vl>内的结点。Floyd算法是解决多源最短路径的一个算法, 它可以允许存在负边, 但不允许存在负环路。算法证明:假设图G的所有...原创 2020-04-05 08:33:41 · 139 阅读 · 0 评论 -
[进阶]——字符串——kmp算法
1.kmp算法1.1.kmp的简单介绍算法复杂度 O(n+m)略1.2. 实现原理1.2.1.改进——相比于普通模式匹配的改进每当一趟匹配过程中出现字符比较不等时, 不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式串向右“滑动”尽可能远的一段距离后,继续进行比较。个人:尽可能向右滑动。 就是为了尽量减少不必要的匹配,提高效率。1.2.2.实现改进需要解决的问题假设主...原创 2020-03-20 10:33:09 · 167 阅读 · 0 评论 -
[.5]——数据结构——数——二叉树[java]
class BinNode{// 节点类 public BinNode lchild; public BinNode rchild; public int data; public BinNode(int data){ this.data = data; this.lchild = null; this.rchild = null; } public Bin...原创 2020-03-16 22:57:16 · 56 阅读 · 0 评论 -
[模板]——数论——快速幂
long qpow(long a, long b){ long base = a; long ret = 1; while(b) { int md = b%2; if(md){ ret = ret*base; } base*=base; b=b/2; } return ret;}原创 2020-03-12 20:59:16 · 108 阅读 · 0 评论 -
排序——插入排序——普通插入排序
1. 插入排序插入排序是逐个将无序序列的元素插入到有序序列中。插入排序的时间复杂度为O(n^ 2) ,空间复杂度为O(1)。最好的时间复杂度是O(n),最坏也就是平均是O(n^2)。算法稳定。2.步骤插入排序从有序序列后一个元素开始,进行向前插入排序,一直到最后一个数向前做插入排序。3.代码实现void insert_sort(int a[], int n){ // a[]...原创 2020-02-23 12:39:12 · 104 阅读 · 0 评论 -
字符串——求最大回文子串——Manacher算法
1. Manacher 算法Manacher算法主要用于处理字符串中求最长回文子串问题的算法。传统的求最长回文子串算法,是先确定一个轴, 然后以该轴为中心向两边遍历判断是否相等,从而得到以该轴为中心最大回文子串,近而获取该字符串的最大回文子串。其时间复杂度为O(n^2)。效率低,而且还要分类处理奇偶长度的回文串。所以一个叫Manacher的人发明了一个算法,即Manacher算法,将时间复杂...转载 2020-02-10 21:59:40 · 400 阅读 · 0 评论