随笔分类 -  数据结构与算法

摘要:暴力子字符串查找算法 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 半条咸鱼 编辑

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