
数据结构和算法
文章平均质量分 71
数据结构和算法基本使用和原理解析
Bulut0907
大数据、机器学习、编程语言、IT相关技术分享, 喜欢请关注、点赞、收藏哦!
展开
-
【数据结构与算法】骑士周游算法/马踏棋盘算法的介绍和程序实现
将马随机放在国际象棋8×8棋盘的某个方格中,马按走棋规则(马走日字)不断的进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格(即移动63次)。如下所示为一个方格的马能移动的位置。原创 2022-11-02 09:16:26 · 1300 阅读 · 0 评论 -
【数据结构与算法】弗洛伊德算法的介绍和最短路径问题程序实现
上一篇我们讲解了迪杰斯特拉算法的介绍和最短路径问题程序实现,迪杰斯特拉算法是求一个开始顶点到其它多个顶点的最短路径而弗洛伊德(Floyd)算法中,每一个顶点都是开始顶点,再求一个开始顶点到其它多个顶点的最短路径问题:有7个村庄A、B、C、D、E、F、G,各个村庄之间的距离(权)用边线表示,比如A -> B距离5公里。现需要求各个村庄之间的最短路径。即A -> E、B -> F、C -> D等// 用10000表示距离无限大,不能连通// N个顶点形成的N * N二维数组,用来保存顶点之间的距离。原创 2022-11-01 09:35:15 · 500 阅读 · 0 评论 -
【数据结构与算法】迪杰斯特拉算法的介绍和最短路径问题程序实现
迪杰斯特拉(Dijkstra)算法是典型求两点之间最短路径算法。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止问题:有7个村庄A、B、C、D、E、F、G,各个村庄之间的距离(权)用边线表示,比如A -> B距离5公里。现有一个快递需要从C村庄送到D村庄,如何走路径最短。从C村庄送到另外5个村庄类似// 用10000表示距离无限大,不能连通// N个顶点形成的N * N二维数组,用来保存顶点之间的距离// 用INFINITY表示距离无限大,不能连通};原创 2022-10-31 09:34:09 · 1942 阅读 · 0 评论 -
【数据结构与算法】克鲁斯卡尔算法的介绍和公交站问题程序实现
和前面普里姆算法的介绍和修路问题程序实现的修路问题一样。克鲁斯卡尔(Kruskal)算法,也是用来求完全图的最小生成树的算法基本思想:按照权重值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路具体做法:先将各条边按权重值从小到大进行排序。从最小权重值的边开始,依次将各个边添加到生成树中。原创 2022-10-31 09:31:33 · 816 阅读 · 0 评论 -
【数据结构与算法】普里姆算法的介绍和修路问题程序实现
最小生成树(Minimum Cost Spanning Tree),简称MST。给定一个带权的无向连通图, 选取一棵生成树, 生成树所有顶点都能连通但不能形成回路。使树上所有边的权的总和为最小, 就是最小生成树。如下所示:所以N个顶点,一定有N-1条边实现最小生成树的算法主要有普里姆算法和克鲁斯卡尔算法普利姆(Prim)算法求最小生成树,就是在包含N个顶点的完全图中,找出只有(N-1)条边且包含所有N个顶点的最小总权重值的连通子图对于第一顶点,直接标记为已访问。原创 2022-10-27 09:17:17 · 704 阅读 · 0 评论 -
【数据结构与算法】贪心算法的介绍和集合覆盖问题程序实现
贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优或者最有利的选择,从而得到导致结果局部最好或者局部最优的算法,但是效率高假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号广播台覆盖地区B1北京, 上海, 天津B2广州, 北京, 深圳B3成都, 上海, 杭州B4上海, 天津B5杭州, 大连。原创 2022-10-26 09:11:55 · 461 阅读 · 0 评论 -
【数据结构与算法】字符串匹配算法之暴力匹配算法、KMP匹配算法
如果当前字符匹配成功(即sourceStr[i] == matchsStr[j]),则i++,j++,继续匹配下一个字符如果不匹配(即sourceStr[i]!= matchsStr[j]),令i = i - j + 1,j = 0。相当于每次匹配失败时,i回溯到下一位继续匹配,j被置为0KMP算法的目的是减少不必要的匹配,提高匹配效率。KMP算法就是利用matchStr形成一个部分匹配表,通过一个partMatch数组,保存matchStr中,截止当前字符形成的字符串,的前后缀最大公共字符串的长度。原创 2022-10-25 09:16:40 · 620 阅读 · 0 评论 -
【数据结构与算法】动态规划算法的介绍和背包问题程序实现
先将待求解问题分解成若干个子问题。各个子问题不是互相独立的(分治法各个子问题是互相独立的),即下一个子问题的求解是建立在上一个子问题的解的基础上,进行进一步的求解再求解子问题,然后从这些子问题的解得到原问题的最优解背包问题是动态规划算法的一个实际应用。物品重量价格吉他(G)11500音响(S)43000电脑(L)32000要求达到的目标为装入的背包的总价值最大,并且重量不超出背包容量要求装入的物品不能重复这里的问题属于01背包,即每个物品最多放一次。原创 2022-10-24 09:38:06 · 434 阅读 · 0 评论 -
【数据结构与算法】分治算法的介绍和汉诺塔程序实现
分治法即分而治之,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,不停的进行分解,直到最后的子问题可以简单的直接求解,原问题的解即子问题的解的合并分治算法求解的经典问题二分搜索大整数乘法棋盘覆盖归并排序快速排序线性时间选择最接近点对问题循环赛日程表傅立叶变换(快速傅立叶变换)汉诺塔汉诺塔介绍:汉诺塔(又称河内塔)是一个益智玩具。有三根柱子,在一根柱子上从下往上按照从大到小的顺序堆着64片圆盘。原创 2022-10-21 08:51:45 · 424 阅读 · 0 评论 -
【数据结构与算法】二分查找算法(折半查找)查找有序序列的多个相同数值、二分查找算法(非递归)的介绍和程序实现
二分查找法只适用于从有序的数列中进行查找。对于无序的数据需要将数列排序后再进行查找二分查找法的运行时间为O(log2n)O(log_2n)O(log2n),即查找到需要的目标位置最多只需要log2nlog_2nlog2n步。假设从[0, 99]的队列(100个数,即n = 100)中寻到目标数30,则需要查找步数为log2100log_2100log2100, 即最多需要查找7次(26原创 2022-10-20 10:19:40 · 1093 阅读 · 0 评论 -
【数据结构与算法】图的介绍和程序实现(含深度优先遍历、广度优先遍历)
图的节点可以具有零个或多个相邻元素。两个节点之间的连接称为边(edge)。节点也可称为顶点(vertex)。如下所示:路径:比如从D -> C的路径有D->B->C和D->A->B->C无向图:上面的图就是一个无向图。顶点之间的连接没有方向有向图:顶点之间的连接有方向。比如A -> B,只能是A -> B,不能是B -> A带权图:边具有权值,比如距离大小。带权图也叫网。原创 2022-10-19 09:55:42 · 1731 阅读 · 0 评论 -
【数据结构与算法】多路查找树的介绍(B树、B+树、B*树)
如果每个节点可以有多个value,且每个节点可以有多个子节点,那就是多叉树(multiway tree)。多叉树能减少树的高度,多叉树有B树、B+树等B即Balanced,B树也叫B-tree树。B树可以减少i/o读写次数来提升效率,如下所示:文件系统及数据库系统的设计者利用磁盘预读原理,将一个磁盘节点的大小设为等于一个页缓存(页缓存得大小通常为4k),这样每个磁盘节点只需要一次I/O就可以完全载入。原创 2022-10-19 09:54:23 · 304 阅读 · 0 评论 -
【数据结构与算法】平衡二叉树之AVL树的介绍和程序实现
平衡二叉树(平衡二叉搜索树、Self-balancing binary search tree、AVL树)可以保证较高的查询效率。特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树也是一棵平衡二叉树,即子树递归下去也是平衡二叉树如下的第1个和第2个是平衡二叉树,第3个不是平衡二叉树平衡二叉树的常用实现方法有红黑树、AVL树、替罪羊树、Treap树、伸展树等。原创 2022-10-18 11:00:55 · 339 阅读 · 0 评论 -
【数据结构与算法】二叉排序树的介绍和程序实现
二叉排序树【BST: Binary Sort(Search) Tree】的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。如果有相同的值,可以将该节点放在左子节点或右子节点(本示例我们放在右子节点)比如针对数列{7, 3, 10, 12, 5, 1, 9},对应的二叉排序树如下添加值为2的节点,结果如下。原创 2022-10-17 09:21:56 · 628 阅读 · 0 评论 -
【数据结构与算法】赫夫曼树的介绍和程序实现,和赫夫曼编码的介绍、原理剖析、程序实现
n个叶子节点(树的所有叶子节点)构建成一个树有很多种方式,每个叶子节点都有一个权重值W,每个叶子到root节点的路径长度为L(层数) - 1。所有叶子节点带权路径长度(W∗(L−1))(W∗(L−1))之和(wpl: weighted path length)最小的树称为赫夫曼树。其权重值越大的节点离root节点越近。如下所示赫夫曼编码(Huffman Coding)是用赫夫曼树进行编码的一种方式, 是可变字长编码(VLC)的一种,是一种程序算法。原创 2022-10-14 09:14:04 · 684 阅读 · 2 评论 -
【数据结构与算法】堆排序算法的介绍和程序实现
堆排序算法是顺序储存二叉树的实际应用,顺序储存二叉树参考地址堆排序是一种选择排序算法,它的最坏,最好,平均时间复杂度均为O(nlogn)O(nlogn)O(nlogn),它也是不稳定排序当完全二叉树每个节点的值都大于或等于其左右子节点的值,称为大顶堆,升序排序时使用;当完全二叉树每个节点的值都小于或等于其左右子节点的值,称为小顶堆,降序排序时使用。如下所示就是一个大顶堆:其对应的数组就是array[n]>=array[2∗n+原创 2022-10-13 09:15:11 · 518 阅读 · 0 评论 -
【数据结构与算法】线索化二叉树的介绍和程序实现
现在我们看线索化二叉树是如何提高遍历的效率的。先将数列{1, 3, 6, 8, 10, 14}构建成一颗二叉树,如下所示:可以看到6, 8, 10, 14这几个节点的左右指针是空指针域,得出n个结点的二叉树中含有n+1【公式2n-(n-1)=n+1】个空指针域。以空间换时间的思想,将二叉树中的左空指针域,指向该节点前序/中序/后序遍历下的前一个节点(前驱节点),将二叉树中的右空指针域,指向该节点前序/中序/后序遍历下的后一个节点(后继节点)。原创 2022-10-12 10:19:45 · 421 阅读 · 0 评论 -
【数据结构与算法】顺序储存二叉树的介绍和程序实现
从数据储存来看,顺序储存二叉树的底层是用数组来储存数据的,如下图所示:而遍历顺序储存二叉树,仍然可以以前序遍历、中序遍历、后序遍历的方式进行遍历顺序存储二叉树的特点顺序储存二叉树通常只考虑完全二叉树第n个元素的左子节点为2∗n+12 * n + 12∗n+1。原创 2022-10-12 10:18:10 · 409 阅读 · 0 评论 -
【数据结构与算法】二叉树的介绍和程序实现
树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。二叉树的子节点分为左节点和右节点如果该二叉树的所有叶子节点都在最后一层,并且节点总数 =2n−12^n -12n−1, n为层数,则我们称为满二叉树,如下所示:如果该二叉树的所有叶子节点都在最后一层或倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。如果把 节点61删除,就不是完全二叉树了, 因为叶子节点不连续了。原创 2022-10-11 09:20:52 · 647 阅读 · 0 评论 -
【数据结构与算法】哈希表(散列表)的介绍和程序实现、树的优点和常用术语介绍
哈希表(Hash table,也叫散列表),主要用来提高查询速度数据的保存过程:一条数据根据key经过映射函数/散列函数(例如进行hash计算然后取模)计算,根据得到的值将数据保存到哈希表(用数组实现)对应的位置数据的查询过程:查询数据也是指定key,然后将该key经过散列函数计算,再根据得到的值从哈希表(用数组实现)指定的位置获取数据。原创 2022-10-10 09:21:27 · 423 阅读 · 0 评论 -
【数据结构与算法】插值查找算法、斐波那契查找算法(黄金分割法)的介绍和程序实现
插值查找算法类似二分查找算法。二分查找算法的mid取值为mid=low+high2=low+12(high−low)mid=2low+high=low+21(high−low)而插值查找算法,并不是取low和high中间的index,而是根据findValue的值的大小来确定mid,findValue值偏大,则mid偏大,findValue值偏小,则mid偏小,这样能缩小查找的范围。原创 2022-10-09 09:21:58 · 673 阅读 · 0 评论 -
【数据结构与算法】基数排序算法(桶排序)的介绍和程序实现
基数排序(Radix Sort)是桶排序的扩展。基数排序属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort基数排序法是属于稳定性的排序,而且效率特别高,但是特别占用内存空间,数据量大容易造成内存溢出。稳定性是指当两个相同的元素,进行排序后,它们的次序并不会发现变化基数排序基本思想:将所有待比较整数数值统一为同样的数位长度,数位较短的数前面补零。原创 2022-10-08 09:17:47 · 665 阅读 · 0 评论 -
【数据结构与算法】快速排序算法、归并排序算法的介绍和程序实现
快速排序(Quicksort)是对冒泡排序的一种改进基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。原创 2022-09-30 09:25:20 · 709 阅读 · 0 评论 -
【数据结构与算法】希尔排序算法的介绍和程序实现(交换法、移动法)
希尔排序也是一种插入排序,是对简单插入排序算法的改良,也称缩小增量排序希尔排序法基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序。随着增量(分组)逐渐减少,每组包含的元素越来越多,当增量(分组)减至1时,算法便终止。如下所示再对上面的数列进行简单的微调,无需大量移动操作即可完成整个数组的排序。原创 2022-09-29 09:25:43 · 405 阅读 · 0 评论 -
【数据结构与算法】插入排序算法的介绍和程序实现
插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的值依次与有序表元素的值依次进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。原创 2022-09-29 09:24:47 · 269 阅读 · 0 评论 -
【数据结构与算法】选择排序算法的介绍和程序实现
选择排序(select sorting)的基本思想是:第一次从arr[0] ~ arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1] ~ arr[n-1]中选取最小值,与arr[1]交换,…,第n-1次从arr[n-2] ~ arr[n-1]中选取最小值,与arr[n-2]交换。总共通过n-1次,得到一个按排序码从小到大排列的有序序列虽然选择排序和冒泡排序的时间复杂度都是O(n2)O(n^2)O(n2),但选择排序对数组的值替换次数少很多,所以执行速度更快。原创 2022-09-27 09:35:10 · 287 阅读 · 0 评论 -
【数据结构与算法】冒泡排序算法的介绍和程序实现
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始), 依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒如果一轮比较下来没有进行过交换,就说明序列有序,不需要进行下一轮的比较了。因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。原创 2022-09-27 09:33:42 · 434 阅读 · 0 评论 -
【数据结构与算法】排序算法的介绍、各排序算法的时间复杂度
定义:排序是将一组数据,依指定的顺序进行排列的过程内部排序:将需要处理的所有数据都加载到内部存储器中进行排序插入排序(直接插入排序、希尔排序)选择排序(简单选择排序、堆排序)交换排序(冒泡排序、快速排序)归并排序基数排序外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。原创 2022-09-26 11:06:42 · 354 阅读 · 0 评论 -
【数据结构与算法】使用递归Recursion解决迷宫问题、和八皇后问题
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。原创 2022-09-26 11:04:34 · 380 阅读 · 0 评论 -
【数据结构与算法】递归Recursion的介绍和基本使用
递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。原创 2022-09-22 09:22:32 · 563 阅读 · 0 评论 -
【数据结构与算法】使用栈Stack来实现后缀表达式(逆波兰表达式)求值
前缀表达式也叫波兰表达式。前缀表达式的运算符位于数字之前,例如(3+4)*5-6 对应的前缀表达式就是- * + 3 4 5 6。因为前缀表达式使用的不多,这里我们只要了解即可,不用关系中缀表达式如何转换成前缀表达式通过前缀表达式求值的步骤:从右至左遍历表达式,遇到数字时,将数字压入栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;重复上述过程直到遍历完成,最后运算得出的值即为表达式的结果从右至左遍历表达式,将6、5、4、3压入栈。原创 2022-09-22 09:20:50 · 1136 阅读 · 0 评论 -
【数据结构与算法】stack栈的介绍和实现、使用栈来实现中缀表达式求值
栈是一个先入后出的有序列表。允许插入(入栈push)和删除(出栈pop)的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)原创 2022-09-21 11:25:56 · 870 阅读 · 0 评论 -
【数据结构与算法】使用单向环形链表解决约瑟夫(Josephu)问题
n的n个人围坐一圈,约定编号为k(1原创 2022-09-21 11:24:35 · 823 阅读 · 0 评论 -
【数据结构与算法】双向链表(添加节点、更新节点、删除节点、打印链表)
双向链表是一种复杂类型的链表,它的节点包含指向数列中前一个节点和下一个节点的指针。双向链表每个节点包含data域、pre域(指向上一个节点)、next域(指向下一个节点)。所以双向链表可以向前或向后查找双向链表可以双向遍历,既可以从头遍历到尾,也可以从尾遍历到头,有效解决了单向链表的缺点,实际开发中双向链表应用比单向链表多,但是实现较困难。我们下面来看下双向链表的简单实现。原创 2022-09-20 09:27:26 · 2084 阅读 · 0 评论 -
【数据结构与算法】单向链表(添加节点、顺序添加节点、更新节点、删除节点、反转链表、获取链表长度、获取倒数第几个节点、打印链表、反转打印链表)
单向链表是有序的列表。以节点的方式来存储,是链式存储,每个节点包含data域和next域(指向下一个节点),所以单向链表在内存中的储存是无序的单向链表分带头节点的单向链表,和没有头节点的单向链表。原创 2022-09-20 09:26:04 · 985 阅读 · 0 评论 -
【数据结构与算法】环形队列的介绍、用数组实现环形数组
队列是一个有序列表,遵循先入先出的原则。可以用数组或链表来实现而环形队列,通过取模的方式,将数组看做是一个环形的。原创 2022-09-09 09:40:09 · 1509 阅读 · 0 评论 -
【数据结构与算法】稀释数组的介绍、和原始二维数组的相互转换
有时一个二维数组很多值都是0或同一个值,可以考虑使用稀释数组来保存数据。原创 2022-09-09 09:38:23 · 396 阅读 · 0 评论 -
【数据结构与算法】线性结构和非线性结构
数据结构就是把数据组织起来,为了更方便地使用数据。不同的数据结构会有不同的数据保存方式一个算法是为了解决一种特定的任务,从数据源读取数据,经过一系列的数据处理,返回结果。算法是独立存在的一种解决问题的方法和思想。原创 2022-09-08 09:46:27 · 366 阅读 · 0 评论 -
一致性哈希算法分区
目录1. 哈希算法分区的缺点2. 一致性哈希算法2.1 一致性哈希环的概念2.2 将服务器映射到Hash环2.3 数据落入服务器规则2.4 一致性哈希算法分区优缺点2.4.1 优点2.4.2 缺点1. 哈希算法分区的缺点虽然哈希算法能做到数据分区,能起到负载均衡+分而治之的作用缺点:每次扩容缩容,数据和服务器的映射关系都会发生变化,需要将所有数据进行再平衡2. 一致性哈希算法一致性哈希算法解决了哈希算法的问题。当服务器的数量发生变化,尽量只对部分服务器产生影响2.1 一致性哈希环的概念一致性H原创 2022-07-05 09:25:25 · 1018 阅读 · 0 评论 -
大数据分治思想:查找大文件相同两行、大文件全排序
目录1. 查找大文件相同两行2. 大文件全排序1. 查找大文件相同两行题目:有一个2T的文本文件,只存在2行相同的数据,请用一台256M内存的单机服务器,找出这相同的2行数据解决步骤:读取一条数据A,求A的hashcode,然后取模,即X = a.hashcode % 10000,X的范围为0 ~ 9999,将数据A保存到fileX文件中按步骤1进行文件的遍历,处理剩余的每条数据。这样2T的文件被分割成10000个小文件,但相同的2行数据肯定在同一个小文件中依次处理每个小文件,找出在一个小文件原创 2022-04-24 09:23:13 · 1514 阅读 · 0 评论