02 2022 档案

摘要:最短路径问题:从某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径 弗洛伊德算法 1、应用场景 (1)既适用于无向加权图,也适用于有向加权图 (2)使用弗洛伊德算法查找最短路径时,只允许环路的权值为负数,其它路径的权值必须为非负数,否则算法执行过程会出错 (3)基于动态规划算法实现 2、 阅读全文
posted @ 2022-02-28 23:37 半条咸鱼 编辑
摘要:最短路径问题:从某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径 迪杰斯特拉算法 1、应用场景 (1)用于查找图中某个顶点到其它所有顶点的最短路径,该算法既适用于无向加权图,也适用于有向加权图 (2)注意,使用迪杰斯特拉算法查找最短路径时,必须保证图中所有边的权值为非负数,否则查找过程 阅读全文
posted @ 2022-02-27 23:41 半条咸鱼 编辑
摘要:修路问题 1、本质:最小生成树问题 2、最小生成树(MST),Minimum Cost Spanning Tree,给定一个带权的无向连通图,选取一棵生成树,使树上所有边上权的总和为最小 (1) N个顶点,一定有N-1条边 (2) 包含全部顶点 (3) N-1条边都在图中 克鲁斯卡尔算法查找最小生成 阅读全文
posted @ 2022-02-27 22:28 半条咸鱼 编辑
摘要:修路问题 1、本质:最小生成树问题 2、最小生成树(MST),Minimum Cost Spanning Tree,给定一个带权的无向连通图,选取一棵生成树,使树上所有边上权的总和为最小 (1) N个顶点,一定有N-1条边 (2) 包含全部顶点 (3) N-1条边都在图中 普里姆算法查找最小生成树的 阅读全文
posted @ 2022-02-27 17:41 半条咸鱼 编辑
摘要:介绍 1.贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法 2.贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果 贪心算法解决集合覆盖问题 1.描述:假设已知广播台 阅读全文
posted @ 2022-02-27 00:18 半条咸鱼 编辑
摘要:介绍 1、Sunday 算法是 BM 算法的改进,Sunday算法的位移比BM算法更大,在匹配随机字符串时效率比其他匹配算法快 2、时间复杂度:文本串长度为 n,模式串长度为 m (1)最好 O(n / m) (2)平均 O(n) (3)最坏 O(n * m) 规则 1、从前往后匹配,在匹配失败时关 阅读全文
posted @ 2022-02-25 18:00 半条咸鱼 编辑
摘要:介绍 1、该算法从模式串的尾部开始匹配,且拥有在最坏情况下O(N)的时间复杂度,是KMP算法的改进 2、坏字符规则 (1)当字符失配时,称文本串中的这个失配字符为坏字符,此时模式串需要向右移动,后移位数 = 坏字符匹配时在模式串中对应的索引 - 坏字符在模式串中最右出现的索引(匹配坏字符的字符) ( 阅读全文
posted @ 2022-02-25 00:36 半条咸鱼 编辑
摘要:介绍 1、解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法 2、利用之前判断过信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过 next 数组找到,前面匹配过的位置 3、文本串长度为 n,模式串长度为 m,时间复杂度 O(n + m) 4、很详 阅读全文
posted @ 2022-02-24 22:51 半条咸鱼 编辑
摘要:暴力子字符串查找算法 1、思路 (1)目标字符串String1,指针i,匹配字符串String2,指针j,i、j从0开始匹配 (2)假设现在String1匹配到 i 位置,String2匹配到 j 位置 (3)如果当前字符匹配成功,即str1[i] == str2[j],则i++,j++,继续匹配下 阅读全文
posted @ 2022-02-24 11:44 半条咸鱼 编辑
摘要:介绍 1、核心思想:将大问题分为小问题进行解决,从而一步步获取最优的处理算法,与分治算法类似 2、与分治算法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的,即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 3、动态规划可以通过填表的方式来逐步推进,得 阅读全文
posted @ 2022-02-24 00:34 半条咸鱼 编辑
摘要:介绍 1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并 2.应用:二分搜索、大整数乘法、棋盘覆盖、归并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表、汉诺塔、快速傅立叶变换 步骤 1.分解 阅读全文
posted @ 2022-02-23 16:28 半条咸鱼 编辑
摘要:概念 1、图:一种数据结构,表示多对多关系 2、顶点(Vertex):具有零个或多个相邻元素 3、边(Edge):两个结点之间的连接 4、无向图:顶点之间的连接没有方向,不区分入度、出度 (1)所有顶点的度数之和 = 边数的两倍 (2)n 个顶点的无向完全图有 n * (n - 1) / 2 条边 阅读全文
posted @ 2022-02-22 12:45 半条咸鱼 编辑
摘要:介绍 1.红黑树是平衡二叉排序/搜索树的改进,插入、删除时不需要频繁的旋转 2.红黑树相比平衡二叉排序/搜索树多出了变色操作,且不需要判断左右子树的绝对高度差 与2-3-4树的关系 1、2节点:黑;3节点:上黑下红;4节点:中间黑,左右红 2、红黑树本质是2-3-4树,一个红黑树只对应一个2-3-4 阅读全文
posted @ 2022-02-20 00:33 半条咸鱼 编辑
摘要:二叉树的缺陷: 1、在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),海量节点对构建二叉树的速度有影响 2、海量节点也会造成二叉树的高度很大,会降低操作速度 多叉树 1、允许每个节点可以有更多的数据项和更多的子节点 2、多叉树通过重新组织节点,减少树的高度,减少i/o读写次数来提 阅读全文
posted @ 2022-02-18 18:14 半条咸鱼 编辑
摘要:基本介绍 1、平衡二叉(排序/搜索)树:又被称为AVL树,改进BST结构不平衡的缺点,查询效率较高 2、它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树 3、平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等 4、利用旋转实现调整树的平 阅读全文
posted @ 2022-02-17 23:53 半条咸鱼 编辑
摘要:基本介绍 1.二叉排序/搜索树:BST(Binary Sort/Search Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大 2.如果有相同的值,可以将该节点放在左子节点或右子节点,或不允许键值相等的节点 3.可高效的完成对数据的查询、 阅读全文
posted @ 2022-02-17 00:14 半条咸鱼 编辑
摘要:基本介绍 1.哈夫曼编码是一种编码方式, 属于一种程序算法 2.它是可变字长编码的一种,是前缀编码,权值必然在叶子节点上,不会造成匹配多义性 3.前缀编码:指对字符集进行编码时,要求字符集中任一字符的编码都不是其它字符的编码的前缀 4.根据排序方法的不同,对应的哈夫曼编码不完全相同,但树的带权路径长 阅读全文
posted @ 2022-02-13 22:07 半条咸鱼 编辑
摘要:基本介绍 1、哈夫曼树(最优二叉树):给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,该树的带权路径长度达到最小 2、最优二叉树是带权路径长度最短的树,权值较大的节点离根较近 3、根据最优二叉树(哈夫曼树)构造过程可知,最优二叉树中只有度为 2 和 0 的结点 (1)已知叶子节点数为 n0 ( 阅读全文
posted @ 2022-02-13 21:02 半条咸鱼 编辑
摘要:基本介绍 1、堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏、最好、平均时间复杂度均为O(nlogn),是不稳定排序。 2、堆是具有以下性质的完全二叉树: (1)大顶堆:每个结点的值都大于或等于其左右孩子结点的值,arr[i]>=arr[2i+1]&&arr[i]>= 阅读全文
posted @ 2022-02-12 22:57 半条咸鱼 编辑
摘要:基本说明 1、二叉链表中,n个节点,含有2n个指针;除根节点外,每个节点都要一个指针引用,总共需要n-1个指针;含2n-(n-1)=n+1个空指针域 2、利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针,这种附加的指针称为"线索" (1)二叉树进行遍历,遍历后的顺序;前 阅读全文
posted @ 2022-02-12 00:52 半条咸鱼 编辑
摘要:基本说明:从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组 要求 1.以数组的方式来存放 2.遍历数组时,仍然可以用前序遍历,中序遍历,后序遍历的方式完成结点的遍历 特点 1.顺序二叉树通常只考虑完全二叉树 2.n表示二叉树中元素的下标,从0开始编号,n 阅读全文
posted @ 2022-02-11 18:13 半条咸鱼 编辑
摘要:概念 1、二叉树:本身是有序树,树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2 (1)二叉树中,第 i 层最多有 2i - 1 个节点 (2)如果二叉树的深度为 k(第 1 层深度为 1),那么此二叉树最多有 2k - 1 个节点 (3)二叉树中,叶子节点数为 n0,度为 2 的节点 阅读全文
posted @ 2022-02-11 15:36 半条咸鱼 编辑
摘要:存储方式的分析对比 1、数组存储方式的分析 (1)优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度 (2)缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低;数组扩容,需要创建一个新数组,要把原数组数据拷贝到新数组,再插入新元素 2、链式存储方式的 阅读全文
posted @ 2022-02-10 22:37 半条咸鱼 编辑
摘要:介绍 1.哈希表,又称散列表,是根据关键码值而直接进行访问的数据结构 2.它通过把关键码值映射到表中一个位置来访问记录, 以加快查找的速度 3.这个映射函数叫做散列函数, 存放记录的数组叫做散列表 两种实现方式 1.数组+链表 2.数组+红黑树 代码实现(数组+单向链表) public class 阅读全文
posted @ 2022-02-10 22:01 半条咸鱼 编辑
摘要:自顶向下的归并排序(递归) public class MergeSort {//从小到大排序 public static void mergeSort(int[] array) { if (array == null || array.length <= 1) { return; } int[] t 阅读全文
posted @ 2022-02-10 15:54 半条咸鱼 编辑
摘要:快速排序是改进的冒泡排序 1、快速排序最多需要约 N2 / 2 次比较,但随机打乱数组能够预防这种情况 (1)潜在缺点:在切分不平衡时可能会极为低效 (2)例如,如果第一次从最小的元素切分,第二次从第二小的元素切分,如此这般,每次调用只会移除一个元素,这会导致一个大子数组需要切分很多次 (3)要在快 阅读全文
posted @ 2022-02-10 15:49 半条咸鱼 编辑
摘要:介绍 1.又称缩小增量排序 2.是插入排序的改进,减小交换次数 3.时间:交换法>移动法,因为访问数组的次数更少 基本思想 1.按一定增量分组,对每组使用插入排序 2.随增量逐渐减少,分组也减少 3.增量为1时,全部元素分为一组,最后一次插入排序,完成排序 代码实现(从小到大排序) public c 阅读全文
posted @ 2022-02-10 15:43 半条咸鱼 编辑
摘要:基本思想(从小到大排序) 1、n个待排序元素看作一个有序表(左),一个无序表(右),初始有序表只含一个元素,无序表含n-1个元素 2、每次从无序表取出第一个元素,把它与有序表最后一个元素倒序比较 3、将它插入到有序表适当位置,直到无序表元素为0 插入方式 1、直接插入排序:在添加新的记录时,使用顺序 阅读全文
posted @ 2022-02-10 15:35 半条咸鱼 编辑
摘要:基本思想(从小到大排序) 1.第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换 2.第 i 次从 arr[i-1]~arr[n-1]中选取最小值, 与 arr[i-1]交换 3.第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值,与 arr[n-2]交换 4.总共 阅读全文
posted @ 2022-02-10 15:30 半条咸鱼 编辑
摘要:代码实现(从小到大排序) public class BubbleSort {//从小到大排序 public static void bubbleSort(int[] array) { if (array == null || array.length <= 1) { return; } int te 阅读全文
posted @ 2022-02-10 15:17 半条咸鱼 编辑
摘要:介绍 1.属于“分配式排序”,是桶排序的拓展 2.以空间换时间,效率高的稳定性排序法 基本思想(从小到大) 1.所有待比较数组统一为同样位数长度,位数较短的数前面补0 2.桶是二维数组,总共10桶,0至9号桶,号数表示位数上的值;从最低位(个位)开始,位数为几,就放入几号桶 3.按二维数组下标0至9 阅读全文
posted @ 2022-02-10 15:16 半条咸鱼 编辑
摘要:介绍 1、是计数排序的拓展,支持小数 2、前提:尽量保证元素分散均匀;当元素越聚集,效率越低;元素集中在同一个桶时,桶排序失效 基本思想(从小到大排序) 1、每个桶储存一定范围的元素 2、将待排序数组映射到桶 3、每个桶自排序,排序方法自定 4、将非空桶的元素顺序取出 阅读全文
posted @ 2022-02-10 15:02 半条咸鱼 编辑
摘要:前提: 1、元素必须为整数 2、元素取值要在一定范围内,且比较集中 3、不支持小数 算法步骤(从小到大排序) 1、扫描整个序列 A,获取最小值 min,最大值 max 2、创建新数组 B,大小为 max - min + 1,B 中相同下标的元素,记录的是 A 中相同值的元素个数,B 中元素下标 + 阅读全文
posted @ 2022-02-10 14:56 半条咸鱼 编辑
摘要:1、稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面 2、不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面 3、k:“桶”的个数 4、In-place:不占用额外内存 5、Out-place:占用额外内存 补充 1、希尔排序 (1)希尔排序的平均时间复杂度和最坏时间 阅读全文
posted @ 2022-02-10 14:22 半条咸鱼 编辑
摘要:空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n)) 常见的空间复杂度 1.O(1):占用空间是常数,不随变量变化而变化 2.O(n):占用空间随变量变化而变化,如一维数组,链表等 3.O(n2):如二维数组 阅读全文
posted @ 2022-02-10 14:04 半条咸鱼 编辑
摘要:时间频度:一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。 时间复杂度 1.若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O( f(n) ),称O( f(n) ) 为算法的渐进时 阅读全文
posted @ 2022-02-10 13:52 半条咸鱼 编辑
摘要:递归规则: 1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 2.方法的局部变量是独立的,不会相互影响, 3.如果方法中使用的是引用类型变量(比如数组), 就会共享该引用类型的数据. 4.递归必须向退出递归的条件逼近, 否则就是无限递归,出现 StackOverflowError 5.当 阅读全文
posted @ 2022-02-10 12:37 半条咸鱼 编辑
摘要:中缀表达式 1、最常见的运算表达式,一般转成后缀表达式 2、求值步骤 (1)创建两个栈,操作符栈 S1、数字栈 S2 (2)从左至右扫描中缀表达式 (3)遇到操作数时,直接入 S2 (4)遇到运算符时,比较其与 S1 栈顶运算符的优先级 1、若 S1 为空或为“(”,直接入栈 2、若优先级 > 栈顶 阅读全文
posted @ 2022-02-10 00:36 半条咸鱼 编辑
摘要:介绍 1.先入后出的有序列表 2.限制线性表中元素的插入和删除只能在同一端;栈顶:允许插入、删除,栈底:固定的一端 3.栈顶:元素最后放入,最先删除;栈底:元素最先放入,最后删除 4.Stack类已过时,用LinkedList类实现栈 应用 1.子程序的调用:在跳往子程序前,会先将下个指令的地址存到 阅读全文
posted @ 2022-02-09 22:29 半条咸鱼 编辑
摘要:约瑟夫问题:已知有n个人(分别编号为1,2,3…n)围坐成一圈,从第一个人开始报数,报到数m的人出圈;再从下一个人开始重新报数,报到m的人出圈;直至剩下最后一个人的时候游戏结束。输出剩下的人的原始编号。 利用单向环形链表解决约瑟夫问题 class Node {//该节点省略data域 public 阅读全文
posted @ 2022-02-09 22:06 半条咸鱼 编辑
摘要:class Node {//该节点省略data域 public int no; public Node next; public Node pre; public Node(int no) { if (no >= 0) {//要求no要大于0 this.no = no; } } @Override 阅读全文
posted @ 2022-02-09 20:45 半条咸鱼 编辑
摘要:import java.util.Stack; class Node {//该节点省略data域 public int no; public Node next; public Node(int no) { if (no >= 0) {//要求no要大于0 this.no = no; } } @Ov 阅读全文
posted @ 2022-02-09 17:23 半条咸鱼 编辑
摘要:1.链式储存,以节点方式储存 2.每个节点含data域,指针域 3.内存结构中,链表各节点不一定为连续储存 4.分类 (1)带头指针;不带头指针 (2)单向链表;双向链表 阅读全文
posted @ 2022-02-09 13:17 半条咸鱼 编辑
摘要:含义:队列是一个有序列表,可以用数组或链表来实现 特点:先进先出,队列中添加和删除数据的操作分别是在两端进行的 数组模拟队列 1.maxSize是队列最大容量;front+1指向队列最前面的元素,创建初始值为-1,随输出而增加;rear指向队列最后的元素,创建初始值为-1,随输入而增加; 2.fro 阅读全文
posted @ 2022-02-09 12:48 半条咸鱼 编辑
摘要:稀疏矩阵(二维数组) 1、矩阵中分布有大量的元素 0,即非 0 元素非常少 2、稀疏矩阵的压缩存储,数据结构提供有 3 种具体实现方式: (1)三元组顺序表 (2)行逻辑链接的顺序表 (3)十字链表 三元组顺序表(压缩存储稀疏矩阵) 1、记录数组一共有几行几列,有多少个不同的值 2、把具有不同值的元 阅读全文
posted @ 2022-02-09 12:04 半条咸鱼 编辑
摘要:线性结构 1.特点:数据元素之间存在一对一的线性关系 2.存储结构 (1)顺序存储结构:顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的 (2)链式存储结构:链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息 3.常见线性结构:数组、队列、链 阅读全文
posted @ 2022-02-09 11:07 半条咸鱼 编辑
摘要:黄金分割点:是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比,其比值是一个无理数,用分数表示为(√5-1)/2,取其前三位数字的近似值是0.618 斐波那契数列:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),随着数列 阅读全文
posted @ 2022-02-09 00:01 半条咸鱼 编辑
摘要:import java.util.ArrayList; public class InsertValueSearch {//假设数组从小到大排序 //递归法,left初始值传入0,right初始值传入array.length - 1 public static ArrayList<Integer> 阅读全文
posted @ 2022-02-08 12:10 半条咸鱼 编辑
摘要:import java.util.ArrayList; public class SequenceSearch { public static ArrayList<Integer> sequenceSearch(int[] array, int find) { ArrayList<Integer> 阅读全文
posted @ 2022-02-07 21:57 半条咸鱼 编辑
摘要:在 N 个键的有序数组中进行二分查找最多需要 (lgN) + 1 次比较(无论是否成功) 向大小为 N 的有序数组中插入一个新的元素在最坏情况下需要访问 2 * N 次数组,因此向一个空符号表中插入 N 个元素在最坏情况下需要访问 N2 次数组 import java.util.ArrayList; 阅读全文
posted @ 2022-02-07 19:57 半条咸鱼 编辑

点击右上角即可分享
微信分享提示