数据结构与算法学习笔记
文章平均质量分 53
数据结构与算法
浊酒南街
纵使疾风起,人生不言弃。
展开
-
数据结构和算法:赫夫曼编码之文件压缩和解压
1)如果文件本身就是经过压缩处理的,那么使用赫夫曼编码再压缩效率不会明显变化,比如视频,ppt等文件。2)读取压缩文件(数据和赫夫曼编码表)---------->完成解压(文件恢复)2)赫夫曼编码是按字节来处理的,因此可以处理所有的文件(二进制文件,文本文件)1)读取文件----->得到赫夫曼编码表------->完成压缩。3)如果一个文件中的内容,重复的数据不多,压缩效果也不会很明显;原创 2023-07-27 17:37:30 · 78 阅读 · 0 评论 -
数据结构和算法:程序员常用的10种算法之KMP算法
1)KMP是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法;2)Knuth-Morris-Pratt字符串查找算法,简称"KMP算法",常用于在一个文本串S内查找一个模式串P的出现位置,这个算法由Donald Knuth,Vaughan Pratt,James H.Morris 三人于1977年联合发表,故取这3人的姓氏命名此算法。原创 2023-08-03 11:08:03 · 50 阅读 · 0 评论 -
数据结构和算法:归并排序
归并排序(merge-sort)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略 (分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案修补在一起,即分而治之)。原创 2023-06-28 15:45:43 · 32 阅读 · 0 评论 -
数据结构和算法:多路查找树之2-3树
2-3树是最简单的B树结构,具有如下特点:1)2-3树的所有叶子节点都在同一层(只要是B树都满足这个条件)2)有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点3)有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点4)2-3树是由二节点和三节点构成的树。原创 2023-07-31 11:46:52 · 45 阅读 · 0 评论 -
数据结构和算法:队列代码实现
数组模拟队列的思想,队列本身是有序列表原创 2023-06-01 20:07:24 · 33 阅读 · 0 评论 -
数据结构和算法:二分查找
请对一个有序数组进行二分查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有,就提示没有这个数;补充:二分查找适用的前提是数组是有序的;原创 2023-06-29 16:02:55 · 28 阅读 · 0 评论 -
数据结构和算法:多路查找树之B树、B+树和B*树
B-tree树即B树,B即Balanced,平衡的意思。有人把B-tree翻译成B-树,容易让人产生误解。会认为B-树是一种树,而B树又是另外一种树,实际上B-tree就是指的B树;前面已经介绍了2-3树和2-3-4树,他们就是B树(英语B-tree 也写成B-树),这里我们再做一个说明,我们在学习Mysql时,经常听到说某种类型的索引是基于B树或者B+树的,如图:对上图的说明:1)B树的阶:节点的最多子节点个数,比如2-3树的阶是3,2-3-4树的阶是4;原创 2023-07-31 16:50:25 · 63 阅读 · 0 评论 -
数据结构和算法:平衡二叉树(AVL树)
案例:给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST),并分析问题所在左边BST存在的问题分析1)左子树全部为空,从形式上看,更像一个单链表2)插入速度没有影响3)查询速度明显降低(因为需要依次比较),不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢;4)解决方案-平衡二叉树(AVL)1)平衡二叉树也就平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树,可以保证查询效率较高;原创 2023-07-28 17:45:40 · 41 阅读 · 0 评论 -
数据结构和算法:程序员常用的10种算法之克鲁斯卡尔算法
1)克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。2)基本思想:按照权值从小到大的顺序选择n-1条边,并保证n-1条边不构成回路3)具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一颗树为止;原创 2023-08-08 17:22:50 · 71 阅读 · 0 评论 -
数据结构和算法:算法的时间复杂度
1)一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同量级函数。3.去除最高阶项的系数,T(n) =n² +7n+6 ==========> T(n) =n² ===============>O(n²)1.用常数1代替运行时间中的所有加法常数,T(n) =n² +7n+6 ==========> T(n) =n² +7n+1。原创 2023-06-25 19:38:23 · 31 阅读 · 0 评论 -
数据结构和算法:栈的快速入门
1)用数组模拟栈的使用,由于栈是一种有序列表,当然可以使用数组的结构来存储栈的数据内容,下面我们就用数组模拟栈的出栈,入栈等操作。2)实现思路分析,并画出示意图。原创 2023-06-08 15:16:44 · 21 阅读 · 0 评论 -
数据结构和算法:环形队列
环形队列,代码实现原创 2023-06-02 11:36:24 · 43 阅读 · 0 评论 -
数据结构和算法:队列(1)
1)队列是一个有序列表,可以用数组或者链表来实现;2)遵循先进先出的原则:即先存入队列的数据,要先取出,后存入的要后取出;3)示意图:(使用数组模拟队列示意图)原创 2023-06-01 17:04:33 · 27 阅读 · 0 评论 -
数据结构和算法:排序算法介绍
排序也称排序算法(sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。原创 2023-06-21 17:02:25 · 27 阅读 · 0 评论 -
数据结构和算法:程序员常用的10种算法之普里姆算法
普里姆(Prim)算法求最小生成式,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通图。普里姆算法如下:1)设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合;2)若从顶点u开始构造最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v的visited[u] =1。原创 2023-08-07 17:45:13 · 41 阅读 · 0 评论 -
数据结构和算法:堆排序代码实现
2)此时我们从最后一个非叶子节点(叶子节点自然不用调整,第一个非叶子节点arr.length/2-1 =1,也就是下面的6节点),从左至右,从下至上进行调整;然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二个元素。3)重新调整结构,使其满足堆定义,然后继续交换堆顶元素和末尾元素,反复执行调整+交换步骤,直到整个序列有序。4)这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,5,6]中6最大,交换4和6;3)找到第二个非叶子节点4,由于[4,9,8]中9元素最大,4和9交换;原创 2023-07-20 20:08:28 · 41 阅读 · 0 评论 -
数据结构和算法:堆排序基本介绍
1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为0(nlogn),它也是不稳定排序;2)堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子的值和右孩子的值的大小关系;3)每个节点的值都小于或者等于其左右孩子节点的值,称为小顶堆;4)大顶堆举例说明:5)小顶堆举例说明:6)一般升序采用大顶堆,降序采用小顶堆;原创 2023-07-18 20:22:05 · 33 阅读 · 0 评论 -
数据结构和算法:栈的介绍
1)栈的英文名为stack2)栈是一个先入后出(FILO-First In Last Out)的有序列表3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端为变化的一端,称为栈顶(top),另一端为固定的一端,称为栈底(bottom)4)根据栈的定义可知,最先放入栈中元素在栈底,最后放入元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最后放入的元素最后删除5)图解方式说明出栈(pop)和入栈(push)的概念。原创 2023-06-07 20:00:01 · 28 阅读 · 0 评论 -
数据结构和算法:顺序存储二叉树
从数据存储来看,数组存储方式和数的存储方式可以相互转换,即数组可以转换成树,数也可以转换成数组。2) 要求在遍历数组arr 时,仍然可以以前序遍历,中序遍历,后序遍历的方式完成节点的遍历;1)根据上图二叉树的特点,要求以数组的方式来存放:arr [1,2,3,4,5,6,7]5) n 为二叉树中的第几个元素(按0开始编号)1)顺序存储二叉树通常只考虑完全二叉树。4)第n个元素的父节点为(n-1)/2。3) 第n个元素的右节点下标为2。2)第n个元素的左节点下标为2。原创 2023-07-05 20:26:14 · 68 阅读 · 0 评论 -
数据结构和算法:赫夫曼编码之数据解压
2)现在要求使用赫夫曼编码,进行解码,又重新得到原来的字符串’i like like like java do you like a java’3)思路:解码过程,就是编码的一个逆向操作。1)前面我们得到了赫夫曼编码和对应的编码。原创 2023-07-27 16:01:04 · 97 阅读 · 0 评论 -
数据结构和算法:链表
链表是有序的列表,但它在内存中的存储如下:小结上图:1)链表是以节点的方式来存储,是链式存储2)每个节点包含data域,next域:指向下一个节点3)链表的每一个节点不一定是连续存储(地址单元)4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。原创 2023-06-02 14:21:38 · 33 阅读 · 0 评论 -
数据结构和算法:约瑟夫问题代码实现
约瑟夫问题:创建环形链表的思路图解。约瑟夫问题:小孩出圈的思路图解。原创 2023-06-07 17:44:53 · 109 阅读 · 0 评论 -
数据结构和算法:稀疏数组代码实现
2.根据sum就可以创建稀疏数组sparseArr int[sum+1][3]1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,2.在读取稀疏数组后几行数据,并赋给原始的二维数据即可;比如上面的chessArr2 =int[11][11]1.遍历原始的二维数组,得到有效数据的个数sum。3.将二维数组的有效数据存入到稀疏数组。原创 2023-06-01 16:12:27 · 45 阅读 · 0 评论 -
数据结构和算法:单向环形链表
提示:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应节点从链表中删除,然后再从被删除节点的下一个节点又从1开始计数,直到最后一个节点从链表中删除,算法结束;设编号为1,2,3,…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。原创 2023-06-07 16:23:36 · 22 阅读 · 0 评论 -
数据结构和算法:冒泡排序
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断逼近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标准flag判断元素是否进行过交换。从而减少不必要的比较。补充:1.n个数排序(外部排序),只需遍历n-1次,每次遍历得到一个最大值放在队尾(从小到大排序);原创 2023-06-26 10:55:59 · 38 阅读 · 0 评论 -
数据结构和算法:逆波兰计算器完整版代码实现
说明:逆波兰计算器完整版考虑的因素较多,下面给出完整代码,思路和前面一样,也是使用到中缀表达式转后缀表达式。3)兼容处理,过滤任何空白字符,包括空格,制表符,换页符;1)支持+,-,*,/,()2)支持多位数和小数。原创 2023-06-20 19:18:40 · 44 阅读 · 0 评论 -
数据结构和算法:基数排序
1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定性的排序,基数排序法是效率高的稳定性排序法3)基数排序(radix sort)是桶排序的拓展4)基数排序是1887年赫尔曼.何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较;原创 2023-06-28 17:29:32 · 44 阅读 · 0 评论 -
数据结构和算法:二叉排序树介绍
需求:给你一个数列(7,3,10,12,5,1,9),要求能够高效的完成对数据的查询和天机解决方案分析:1)使用数组数组未排序,优点:直接在数组尾添加,速度快。缺点:查找速度慢数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。2)使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比较快,不需要整体移动3)使用二叉排序树。原创 2023-07-28 10:43:04 · 34 阅读 · 0 评论 -
数据结构和算法:赫夫曼编码
1)赫夫曼编码也翻译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,属于一种程序算法;2)赫夫曼编码是赫夫曼树在电讯通信中的经典的应用之一。3)赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间;4)赫夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方式,称之为最佳编码;原创 2023-07-26 11:22:10 · 49 阅读 · 0 评论 -
数据结构和算法:多路查找树之二叉树与B树
B树通过重新组织节点,降低树的高度,并且减少i/o读写次数来提升效率1)如图 B树通过重新组织节点,降低了树的高度;2)文件系统及数据库系统的设计者利用了磁盘预读原理,将一个节点的到校设为等于一个页(页的大小通常为4k),这样每个节点只需要一次I/O就可以完全载入3)将树的度M设置为1024,在600亿个元素中最多只需要4次i/o操作就可以读取到想要的元素,B树(B+)广泛应用于文件存储系统以及数据库系统中;原创 2023-07-31 11:18:07 · 43 阅读 · 0 评论 -
数据结构和算法:程序员常用的10种算法之贪心算法
1)贪婪算法(贪心算法)是指再对问题进行求解时,在每一步选择中都选取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法;2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果;原创 2023-08-04 11:42:40 · 93 阅读 · 0 评论 -
数据结构和算法:程序员常用的10种算法之马踏棋盘算法
1)马踏棋盘算法也被称为骑士周游问题2)将马随机放在国际象棋的8X8 棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格;原创 2023-08-10 15:53:36 · 101 阅读 · 0 评论 -
数据结构和算法:线索化二叉树
1)n个节点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域。利用二叉链表中的空指针域,存放指向该节点在某种遍历次序下的前驱和后继节点的指针(这种附加的指针称为线索)2)这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinartTree)。根据线索性质的不同,线索二叉树,可以分为前序线索二叉树,中序线索二叉树和后序线索二叉树三种;3)一个节点的前一个节点,称为前驱节点4)一个节点的后一个节点,称为后继节点。原创 2023-07-17 17:46:43 · 64 阅读 · 0 评论 -
数据结构和算法:二叉排序树代码实现
3、确定targetNode 是parent的左子节点还是右子节点。3、确定targetNode 的子节点是左子节点还是右子节点。4、targetNode是parent的左子节点还是右子节点。1、需要先去找到要删除的节点 targetNode。2、找到targetNode的父节点 parent。1、需要先去找到要删除的节点 targetNode。2、找到targetNode的父节点 parent。2、找到targetNode的父节点 parent。3、从targetNode的右子树找到最小的节点。原创 2023-07-28 11:37:37 · 34 阅读 · 0 评论 -
数据结构和算法:程序员常用的10种算法之迪杰斯特拉算法
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层扩展(广度优先搜索思想),直至扩展到终点为止;算法过程:1)设置出发顶点为v,顶点集合V{v1,v2,vi…},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di…},Dis集合记录着v到图中各顶点的距离(到自身可以看作0,v到vi距离对应为di)2)从Dis中选择值最小的di并移出Dis集合,同时移出V集合中对应的顶点vi,此时的v到vi即为最短路径。原创 2023-08-09 15:19:57 · 98 阅读 · 0 评论 -
数据结构和算法:稀疏数组(1)
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组;稀疏数组的处理方法是:1)记录数组一共有几行几列,有多少不同的值2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模;原创 2023-06-01 15:13:18 · 27 阅读 · 0 评论 -
数据结构和算法:递归的基本介绍
5)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕;4)递归必须向退出递归的条件逼近,否则就是无限递归,出现stackoverflowerror,死归了;1)各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题;3)如果方法中使用的引用类型变量(比如数组),就会共享该引用类型的数据。2)各种算法中会使用到递归,比如快排,归并排序,二分查找,分治算法;2)方法的局部变量是独立的,不会相互影响,比如n变量;原创 2023-06-20 20:03:28 · 36 阅读 · 0 评论 -
数据结构和算法:哈希表介绍
散列表(Hash table ,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫散列函数,存放记录的数组叫做散列表;原创 2023-06-30 16:58:18 · 37 阅读 · 0 评论 -
数据结构和算法:斐波那契查找算法
斐波那契查找算法又称黄金分割法查找算法,黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618.由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意想不到的效果。斐波那契数列{1,1,2,3,5,8,13,21,34,55}发现斐波那契数列的两个相邻数的比例,无限接近黄金分割0.618;原创 2023-06-30 10:28:14 · 124 阅读 · 0 评论 -
数据结构和算法:查找算法之线性查找算法
在java中,我们常用的查找算法有四种;1)顺序(线性)查找2)二分查找/折半查找3)差值查找4)斐波那契查找。原创 2023-06-29 15:04:27 · 33 阅读 · 0 评论