数据结构与算法
数据结构与算法
ALin_Think
这个作者很懒,什么都没留下…
展开
-
马踏棋盘(回溯算法)——十大算法
马踏棋盘问题回溯算法回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。问题基本介绍1、马踏棋盘算法...原创 2020-04-03 00:50:48 · 2275 阅读 · 0 评论 -
弗洛伊德(Floyd)算法——十大算法
弗洛伊德(Floyd)算法基本介绍1、和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名2、弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径3、迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。4、弗洛伊德算****法 VS...原创 2020-04-02 01:02:33 · 2476 阅读 · 1 评论 -
迪杰斯特拉(Dijkstra)算法——十大算法
迪杰斯特拉(Dijkstra)算法基本介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。思路设置出发顶点为v,顶点集合V{v1,v2,vi…},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di…},Dis集合记录着v到图中各顶点的距离(到自身可以...原创 2020-04-01 15:36:50 · 773 阅读 · 0 评论 -
KMP算法——十大算法
KMP算法基本介绍1、KMP是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法2、Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法.3、KMP...原创 2020-04-01 01:35:30 · 297 阅读 · 0 评论 -
克鲁斯卡尔(kruskal)算法——十大算法
克鲁斯卡尔(Kruskal)算法基本介绍克鲁斯卡尔算法是用来求加权连通图的最小生成树的算法。基本思想按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止问题举例1、某城市新增7个站点(A, B, C, D, E, F, G) ,现在需要修路把7个...原创 2020-04-01 00:57:50 · 970 阅读 · 0 评论 -
普里姆算法——十大算法
普里姆算法基本介绍普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图基本思想1、设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合2、若从顶点u开始构造最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v的visited[u]=13、若集合U中顶点ui...原创 2020-03-31 21:31:46 · 904 阅读 · 0 评论 -
贪婪算法——十大算法
贪婪算法基本介绍1、贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法2、贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果问题举例假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号。思路...原创 2020-03-31 20:08:41 · 3128 阅读 · 0 评论 -
动态规划——十大算法
动态规划基本介绍1、动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法2、动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。3、与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。( 即下一个子阶段的求解是建立...原创 2020-03-29 23:45:52 · 3529 阅读 · 0 评论 -
分治算法——十大算法
分治算法基本思想1、分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题2、解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题3、合并:将各个子问题的解合并为原问题的解。汉诺塔问题1、将A塔的所有圆盘移动到C塔2、小圆盘上不能放大圆盘3、在三根柱子之间一次只能移动一个圆盘代码public class Hanoitower { publ...原创 2020-03-29 21:38:17 · 345 阅读 · 0 评论 -
二分查找(非递归)——十大算法
二分查找(非递归)基本介绍1、二分查找法的运行时间为对数时间O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100 , 即最多需要查找7次( 2^6 < 100 < 2^7)基本思想首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功...原创 2020-03-29 00:10:44 · 315 阅读 · 0 评论 -
一文了解图的内容
文章目录图图的意义基本介绍无向图有向图带权图表示方式领接矩阵领接表图的遍历深度优先遍历(Depth First Search)思路过程广度优先遍历(Broad First Search)思路过程代码图图的意义当我们需要表示多对多的关系时, 这里我们就用到了图基本介绍图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。1)顶点(verte...原创 2020-03-28 23:54:28 · 210 阅读 · 0 评论 -
B树、B+树、B*树
文章目录B树、B+树、B*树二叉树的问题分析多叉树基本介绍2-3树基本介绍B树基本介绍B树的搜索B+树基本介绍B*树基本介绍B树、B+树、B*树二叉树的问题分析二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树1、二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多, 就存在如下问题2、问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据...原创 2020-03-27 22:19:44 · 507 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡二叉树(AVL树)基本介绍1、平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。2、它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。为什么需要AVL树问题给定一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST)分析:1、左子树全...原创 2020-03-27 17:08:06 · 218 阅读 · 0 评论 -
二叉排序树
二叉排序树基本介绍二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点创建过程1、如果二叉树根结点不存在,那么把数组第一位当作根结点2、数组后续的的值与二叉树结点的值进行判断3、如果数组的值小,则左...原创 2020-03-26 21:09:12 · 180 阅读 · 0 评论 -
赫夫曼编码解压缩
赫夫曼编码基本介绍1、赫夫曼编码也翻译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法2、赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。3、赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间4、赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码原理1、构建赫夫曼树1...原创 2020-03-26 16:57:34 · 390 阅读 · 1 评论 -
通俗易懂的赫夫曼树
赫夫曼树基本介绍1、给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称赫夫曼树。2、赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。概念1、路径:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。2、路径长度:通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路...原创 2020-03-26 10:49:07 · 214 阅读 · 0 评论 -
轻松简单的堆排序讲解
堆排序基本介绍1、堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。2、堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。映射到数组基本思想1、...原创 2020-03-25 20:11:24 · 304 阅读 · 0 评论 -
线索化二叉树
线索化二叉树基本介绍1、n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")2、这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后...原创 2020-03-24 23:14:00 · 202 阅读 · 0 评论 -
顺序存储二叉树
顺序存储二叉树基本说明从数据的存储来看,数组存储方式和树的存储方式可以相互转化,即数组可以转化成树,树也可以转化为数组图解顺序存储特点1、顺序存储通常考虑完全二叉树2、第n个元素的左子节点为2n+13、第n个元素的右子节点为2n+24、第n个元素的父节点为(n-1)/2需求给定一个数组{1,2,3,4,5,6,7},要求以二叉树前序遍历结果:1,2,4,5,3,6,7代码...原创 2020-03-23 13:39:53 · 217 阅读 · 0 评论 -
二叉树以及前、中、后序遍历
二叉树树的结构二叉树的概念前序、中序、后序遍历前序:先输出根节点,在遍历左子树,在遍历右子树中序:先遍历左子树,在输出根节点,在遍历右子树后序:先遍历历左子树,在遍历右子树,在输出根节点代码package tree;public class BinaryTreeDemo { public static void main(String[] args) { ...原创 2020-03-23 09:49:10 · 204 阅读 · 0 评论 -
哈希表
题目有一个公司,当有新当员工报道,将该员工当信息加入(id,姓名),当输入该员工当id,要求查找该员工当所有信息。要求不使用数据库,速度越快越好提示哈希表哈希表基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的...原创 2020-03-23 08:31:24 · 177 阅读 · 0 评论 -
插值查找
插值查找基本原理查找前数组必须排序(前提)1、插值查找类似二分查找,但是插值查找每次从自适应mid处开始查找2、二分查找,low表示左索引,high表示右索引3、插值查找注意事项1、对于数据量大,关键字分布比较均匀查找来说,采用插值查找快2、分布不均匀,不一定比二分查找快代码public class InsertValueSearch { public stati...原创 2020-03-22 10:09:50 · 186 阅读 · 0 评论 -
二分查找
二分查找基本思想首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。过程前提,数组arr已经排序好,假设从小到大,所要查找的值...原创 2020-03-20 04:49:42 · 163 阅读 · 0 评论 -
基数排序
基数排序基本思想将整数按位数切成不同的数字,然后按每个位数分别比较过程将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。直到比较完最大数据的最高位。1、假想存在10个桶,代号分别为0-92、原数组[34,29,50,2,24]3、第一次按照个位进行排序4、桶:0——1——2——3——4——5——6——7——8——9 50 ...原创 2020-03-20 03:46:41 · 188 阅读 · 0 评论 -
归并排序
归并排序基本思想归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。图解过程主要为两部分:分与合1、不断拆分数组,直至达到可以...原创 2020-03-18 01:41:22 · 157 阅读 · 0 评论 -
快速排序
快速排序基本思想先从数列中取出一个数作为key值;将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;对左右两个小数列重复第二步,直至各区间只有1个数。过程1、原数组:1,4,3,5,22、假设以中间为基准,第一次先取出基准值3,然后两侧存在“指针”,分别指向1和23、如果左侧指针1所指对象小于基准值3,则左侧指针left右移动,即left++,同理如果右侧大于基准...原创 2020-03-17 23:49:05 · 154 阅读 · 0 评论 -
希尔排序
希尔排序基本思想在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。过程假设有8个数据,设置路径为数组长度的一半,即为4,那么增量为4的数据为一组(如:28与59为一组,他们的下标分别为0和4,同理14与20为一组,下标分别为1,5,依此类推),分组之后各自采用插入排序进行排...原创 2020-03-17 21:45:19 · 252 阅读 · 0 评论 -
约瑟夫问题
约瑟夫问题有n个人,编号为1~n,从第k(1<=k<=n)个人开始报数,从1开始报,报到m的人会出列,然后从第m+1个人开始,重复以上过程。直到所有让出列,由此产生一个出队序列分析构建一个单向单环形链表思路1、先创建第一个节点,让first指向该节点,并形成环形2、后面当我们每创建一个新当节点,就把该节点加入到已有到环形链表中遍历环形链表思路1、先生存一个辅助变量cur,...原创 2020-03-09 02:35:48 · 124 阅读 · 0 评论 -
中缀转后缀
1、初始化两个栈:运算符栈是s1和存储中间结果的栈s2;2、从左至右扫描中缀表达式;3、遇到操作数,将其压入s2;4、遇到运算符时,比较与s1栈顶运算符的优先级;4.1)如果s1为空,则直接压入s1;4.2)否则,若优先级比栈顶元素高,也压入s1;4.3)否则,将s1运算符弹出并压入s2中,再次转4.1)与s1中新的运算符比较5、遇到括号时候:5.1)如果是“(”,直接压入s1;...原创 2020-03-13 08:45:24 · 849 阅读 · 0 评论 -
迷宫问题
public class Maze { public static void main(String[] args) { // 模拟迷宫 int[][] map = new int[8][7]; for (int i = 0; i < 7; i++) { map[0][i] = 1; m...原创 2020-03-14 01:13:37 · 166 阅读 · 0 评论 -
八皇后问题
八皇后问题在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法package recursion;public class Queue8 { // 表示有多少个皇后 int max = 8; // 皇后位置的结果 int[] array = new int[max]; static...原创 2020-03-14 01:52:14 · 369 阅读 · 2 评论 -
选择排序
选择排序基本思想在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换;第二次遍历n-2个数,找到最小的数值与第二个元素交换;。。。第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。思路图解原始: 89,77,110,2第一轮: 2,77,110,89第二轮: 2,77,110,89第三轮: 2,77,89,110时间复杂度...原创 2020-03-15 14:47:15 · 226 阅读 · 0 评论 -
冒泡排序
冒泡排序基本思想通过对待排序的序列从前向后,依次比较相邻元素的值,若发现逆序则交换,使值大的元素从前移动至后方,就像水里的气泡从底部往上冒。过程1、比较两数大小,如果第一个数大,则交换位置2、一轮比较下来,最后一位排好数据(即最大数据在最后一位)3、继续重复1-2,直到把第一个位置排好优化因为排序的过程中,各元素不断接近自己的位置,如果一趟下来没有交换过,就说明有序,因此可以设置一...原创 2020-03-15 14:18:03 · 196 阅读 · 0 评论 -
插入排序
插入排序基本思想在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。过程在要排序的一组数中,把数组拆分成两个部分,假想存在两个“数组”,一个是有序的数组,一个是无序的数组,开始的时候,数组有序的部分只有1个数据,且为数组的第一位,然后从按顺序从无序的数组(除第一位剩下原数组的部分)中拿出每个数据跟有...原创 2020-03-15 22:57:13 · 129 阅读 · 0 评论