
数据结构与算法
文章平均质量分 90
数据结构与算法相辅相成,不会孤立存在;数据结构是为算法服务的,算法是作用在特定的数据结构之上(如数组具有随机访问的特点,二分查找算法需要用数组来存储数据)。数据结构是静态的,只是组织数据的一种形式,若不在它的基础上操作、构建算法、孤立存在的数据结构是没有意义的。
之乎者也·
机车疾驰在路上,代码飞舞在指尖,热血与逻辑交织,创造属于我的数字世界。
展开
-
数据结构与算法面试分享(三十): kd树算法原理
本文介绍一种用于高维空间中的快速最近邻和近似最近邻查找技术——Kd-Tree(Kd树)。Kd-Tree,即K-dimensional tree,是一种高维索引树形数据结构,常用于在大规模的高维数据空间进行最近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nearest Neighbor),例如中的高维图像特征向量的K近邻查找与匹配。本文首先介绍Kd-Tree的基本原理,然后对基于BBF的近似查找方法进行介绍,最后给出一些参考文献和开源实现代码。原创 2023-12-27 12:53:07 · 1033 阅读 · 0 评论 -
数据结构与算法面试分享(二十九):解密字典树
本文将从最基础的字典树的原理进行介绍,并延伸到实际使用中,逐步揭开字典树的神秘面纱。4、指针指向“k”字符,从字典树的“j”节点向下寻找内容为“k”的子节点,匹配到“k”节点,并发现“k”节点是一个单词的结尾,记录匹配到单词“byjk”,指针已到结尾,以待匹配字符串的第2个字符“b”的匹配结束。7、指针指向“k”字符,从字典树的“j”节点向下寻找内容为“k”的子节点,匹配到“k”节点,并发现“k”节点是一个单词的结尾,记录匹配到单词“byjk”,指针已到结尾,完整的匹配结束。原创 2023-12-27 12:44:30 · 838 阅读 · 0 评论 -
数据结构与算法面试分享(二十八):分治算法
使用递归的方式计算子矩阵的乘积,即计算 P1 = A11 * (B12 - B22),P2 = (A11 + A12) * B22,P3 = (A21 + A22) * B11,P4 = A22 * (B21 - B11),P5 = (A11 + A22) * (B11 + B22),P6 = (A12 - A22) * (B21 + B22),P7 = (A11 - A21) * (B11 + B12)。将数组中小于枢轴的元素放在枢轴的左边,将大于枢轴的元素放在枢轴的右边。原创 2023-12-27 12:40:31 · 531 阅读 · 0 评论 -
数据结构与算法面试分享(二十七):遍历(BFS & DFS)
它的思想: 假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。显然,深度优先搜索是一个递归的过程。广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS。原创 2023-12-27 12:31:00 · 887 阅读 · 0 评论 -
数据结构与算法面试分享(二十六):Snowflake算法
Snowflake,雪花算法是由Twitter开源的分布式ID生成算法,以划分命名空间的方式将 64-bit位分割成多个部分,每个部分代表不同的含义。而 Java中64bit的整数是Long类型,所以在 Java 中 SnowFlake 算法生成的 ID 就是 long 来存储的。Snowflake 的Twitter官方原版是用Scala写的,对Scala语言有研究的同学可以去阅读下,以下是 Java 版本的写法。但是我们 IDC 和机器数肯定不止一个,所以毫秒内能生成的有序ID数是翻倍的。原创 2023-12-27 12:28:35 · 425 阅读 · 0 评论 -
数据结构与算法面试分享(二十五):ZAB算法
ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并没有使用 Paxos ,而是采用了 ZAB 协议。ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复和原子广播协议。下面我们会重点讲这两个东西。基于该协议,Zookeeper 实现了一种 主备模式 的系统架构来保持集群中各个副本之间数据一致性。原创 2023-12-27 12:24:46 · 798 阅读 · 0 评论 -
数据结构与算法面试分享(二十四):Raft算法
不同于Paxos算法直接从分布式一致性问题出发推导出来,Raft算法则是从多副本状态机的角度提出,用于管理多副本状态机的日志复制。Raft实现了和Paxos相同的功能,它将一致性分解为多个子问题: Leader选举(Leader election)、日志同步(Log replication)、安全性(Safety)、日志压缩(Log compaction)、成员变更(Membership change)等。同时,Raft算法使用了更强的假设来减少了需要考虑的状态,使之变的易于理解和实现。原创 2023-12-27 09:02:59 · 950 阅读 · 0 评论 -
数据结构与算法面试分享(二十三):Paxos算法
Paxos算法是Lamport宗师提出的一种基于消息传递的分布式一致性算法,使其获得2013年图灵奖。Paxos由Lamport于1998年在《The Part-Time Parliament》论文中首次公开,最初的描述使用希腊的一个小岛Paxos作为比喻,描述了Paxos小岛中通过决议的流程,并以此命名这个算法,但是这个描述理解起来比较有挑战性。后来在2001年,Lamport觉得同行不能理解他的幽默感,于是重新发表了朴实的算法描述版本《Paxos Made Simple》。原创 2023-12-27 08:51:37 · 963 阅读 · 0 评论 -
数据结构与算法面试分享(二十二):一致性Hash算法
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。平衡性(Balance): 平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。单调性(Monotonicity)原创 2023-12-27 08:42:40 · 814 阅读 · 0 评论 -
数据结构与算法面试分享(二十一):后缀树(Suffix Tree)
上述字符串匹配算法(朴素的字符串匹配算法, KMP 算法, Boyer-Moore算法)均是通过对模式(Pattern)字符串进行预处理的方式来加快搜索速度。对 Pattern 进行预处理的最优复杂度为 O(m),其中 m 为 Pattern 字符串的长度。那么,有没有对文本(Text)进行预处理的算法呢?本文即将介绍一种对 Text 进行预处理的字符串匹配算法:后缀树(Suffix Tree)。后缀树的性质存储所有 n(n-1)/2 个后缀需要 O(n) 的空间,n 为的文本(Text)的长度;原创 2023-12-27 08:27:09 · 1590 阅读 · 0 评论 -
数据结构与算法面试分享(二十):BM 算法 (Boyer-Moore)
在 1977 年,Robert S. Boyer (Stanford Research Institute) 和 J Strother Moore (Xerox Palo Alto Research Center) 共同发表了文章《A Fast String Searching Algorithm》,介绍了一种新的快速字符串匹配算法。这种算法在逻辑上相对于现有的算法有了显著的改进,它对要搜索的字符串进行倒序的字符比较,并且当字符比较不匹配时无需对整个模式串再进行搜索。对模式字符的比较顺序时从右向左;原创 2023-12-27 08:17:26 · 991 阅读 · 0 评论 -
数据结构与算法面试分享(十九):KMP 算法(Knuth-Morris-Pratt)
如下算法解释主要来源于这里,但是通常很难阅读完全,我推荐你直接进入下一节图例解释部分。我们来观察一下朴素的字符串匹配算法的操作过程。如下图(a)中所描述,在模式 P = ababaca 和文本 T 的匹配过程中,模板的一个特定位移 s,q = 5 个字符已经匹配成功,但模式 P 的第 6 个字符不能与相应的文本字符匹配。此时,q 个字符已经匹配成功的信息确定了相应的文本字符,而知道这 q 个文本字符,就使我们能够立即确定某些位移是非法的。原创 2023-12-26 17:13:57 · 988 阅读 · 0 评论 -
数据结构与算法面试分享(十八):朴素算法(Naive)
没有预处理阶段;滑动窗口总是后移 1 位;对模式中的字符的比较顺序不限定,可以从前到后,也可以从后到前;匹配阶段需要 O((n - m + 1)m) 的时间复杂度;需要 2n 次的字符比较;很显然,朴素的字符串匹配算法 NAIVE-STRING-MATCHER 是最原始的算法,它通过使用循环来检查是否在范围 n-m+1 中存在满足条件 P[1..m] = T [s + 1..s + m] 的有效位移 s。原创 2023-12-26 15:00:12 · 451 阅读 · 0 评论 -
数据结构与算法面试分享(十七):国密算法
为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。最后给椭圆曲线上密钥对的生成以及公钥的验证,用户的密钥对为(s,sP),其中s为用户的私钥,sP为用户的公钥,由于离散对数问题从sP难以得到s,并针对素域和二元扩域给出了密钥对生成细节和验证方式。SM9算法不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保障。原创 2023-12-26 13:03:44 · 1050 阅读 · 0 评论 -
数据结构与算法面试分享(十六):回溯算法
一行一行地摆放,在确定一行中的那个皇后应该摆在哪一列时,需要用三个标记数组来确定某一列是否合法,这三个标记数组分别为: 列标记数组、45 度对角线标记数组和 135 度对角线标记数组。在实现上,和 Permutations 不同的是要先排序,然后在添加一个元素时,判断这个元素是否等于前一个元素,如果等于,并且前一个元素还未访问,那么就跳过这个元素。在 n*n 的矩阵中摆放 n 个皇后,并且每个皇后不能在同一行,同一列,同一对角线上,求所有的 n 皇后的解。原创 2023-12-26 12:35:43 · 826 阅读 · 0 评论 -
数据结构与算法面试分享(十五):二分法
从上面的规律可以知道,如果 nums[m] == nums[m + 1],那么 index 所在的数组位置为 [m + 2, h],此时令 l = m + 2;在循环条件为 l原创 2023-12-26 12:25:47 · 360 阅读 · 0 评论 -
数据结构与算法面试分享(十四):贪心算法
优先考虑令 nums[i - 1] = nums[i],因为如果修改 nums[i] = nums[i - 1] 的话,那么 nums[i] 这个数会变大,就有可能比 nums[i + 1] 大,从而影响了后续操作。而 d - a = (d - c) + (c - b) + (b - a) ,因此当访问到一个 prices[i] 且 prices[i] - prices[i-1] > 0,那么就把 prices[i] - prices[i-1] 添加到收益中,从而在局部最优的情况下也保证全局最优。原创 2023-12-26 12:19:08 · 877 阅读 · 0 评论 -
数据结构与算法面试分享(十三):动态规划算法
在 A[i] - A[i - 1] == A[i - 1] - A[i - 2] 的条件下,{A[i - 2], A[i - 1], A[i]} 是一个等差递增子区间。如果 {A[i - 3], A[i - 2], A[i - 1]} 是一个等差递增子区间,那么 {A[i - 3], A[i - 2], A[i - 1], A[i]} 也是等差递增子区间,dp[i] = dp[i-1] + 1。也就是说要先计算 dp[i][j] 再计算 dp[i][j-w],在程序实现时需要按倒序来循环求解。原创 2023-12-26 12:02:16 · 995 阅读 · 0 评论 -
数据结构与算法面试分享(十二):最小生成树(Prim & Kruskal) - 最短路径(Dijkstra & Frolyd)
因为Kruskal涉及大量对边的操作,所以它适用于稀疏图;普通的prim算法适用于稠密图,但堆优化的prim算法更适用于稀疏图,因为其时间复杂度是由边的数量决定的。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。最短路径不一定是经过边最少的路径,但在这些最短路径中,长度最短的那一条路径上只有一条边,且它的权值在从源点出发的所有边的权值最小。原创 2023-12-26 11:14:46 · 953 阅读 · 0 评论 -
数据结构与算法面试分享(十一):前缀树(Trie Tree)
在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。Trie 这个术语来自于 retrieval。根据词源学,trie 的发明者 Edward Fredkin 把它读作/ˈtriː/ “tree”。原创 2023-12-26 10:12:04 · 1151 阅读 · 0 评论 -
数据结构与算法面试分享(十):哈夫曼树(Huffman Tree)
从树中一个节点到另一个节点之间的分支构成了两个节点之间的路径,路径上的分支数目称作路径长度。若规定根节点位于第一层,则根节点到第H层的节点的路径长度为H-1。如到40 的路径长度为1;20的路径长度为3。: 树的带权路径长度为所有叶子节点的带权路径长度之和,称为WPL。: 从根节点到某个节点之间的路径长度与该节点的权的乘积。从根节点到每一个叶子节点的路径上,左分支记为0,右分支记为1,将这些0与1连起来即为叶子节点的哈夫曼编码。: 将树中的节点赋予一个某种含义的数值作为该节点的权值,该值称为节点的权;原创 2023-12-26 09:55:16 · 1003 阅读 · 0 评论 -
数据结构与算法面试分享(九):红黑树(R-B Tree)
有了二叉搜索树,为什么还需要平衡二叉树?在学习二叉搜索树、平衡二叉树时,我们不止一次提到,二叉搜索树容易退化成一条链这时,查找的时间复杂度从O(log_{2}N)也将退化成O ( N )引入对左右子树高度差有限制的平衡二叉树,保证查找操作的最坏时间复杂度也为O(log_{2}N)有了平衡二叉树,为什么还需要红黑树?AVL的左右子树高度差不能超过1,每次进行插入/删除操作时,几乎都需要通过旋转操作保持平衡在频繁进行插入/删除的场景中,频繁的旋转操作使得AVL的性能大打折扣。原创 2023-12-26 09:34:21 · 1156 阅读 · 0 评论 -
数据结构与算法面试分享(八):平衡二叉树(AVL)
AVL树是高度平衡的二叉树。它的特点是: AVL树中任何节点的两个子树的高度最大差别为1。上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都原创 2023-12-26 09:22:19 · 865 阅读 · 0 评论 -
数据结构与算法面试分享(七):二叉搜索树(BST)
若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点。动画效果请参考BST。原创 2023-12-26 09:01:57 · 1019 阅读 · 0 评论 -
JAVA面试题分享一百零一:红黑树平衡二叉树优缺点和应用场晕?判断二叉树是否对称?
面试过程中,多多少少会问一点数据结构(二叉树)的问题,今天我们来复习一下二叉树的相关问题,文末总结。1、为什么有了数组和链表还要引入二叉树?针对数组和链表的优缺点,无法说链表一定优于数组,或者是数组一定优于链表,因为某些长期的需要,所以就推出一个相对折中的二叉树。2、为什么有了二叉树还要引入平衡二叉树?有了二叉树还不算完,二叉树有一种极端的情况,就是所有的子结点偏向一端,二叉树退化成链表,这就相当于我选择了这种的二叉树,你现在罢工不干了,找了个链表来糊弄我...原创 2023-11-29 09:10:12 · 939 阅读 · 0 评论 -
JAVA面试题分享一百:b树,b+树的概念和区别?
B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树(B树是一颗多路平衡查找树它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图.所有键值分布在整颗树中(索引值和具体data都在每个节点里);任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束(最好情况O(1)就能找到数据);在关键字全集内做一次查找,性能逼近二分查找;所有关键字存储在叶子节点出现,内部节点(非叶子节点并不存储真正的 data)原创 2023-11-29 09:08:41 · 1364 阅读 · 0 评论 -
JAVA面试题分享九十九:红黑树和B十树的区别?
红黑树作为自平衡二叉树的经典,是计算机科学领域中很基础也重要的数据结构,在1972年由Rodolf Bayer教授发明,又在1978年命名为“红黑树”,其作为一种自平衡的二叉树,通过每次插入和删除的自旋方式保证树的平衡态,从而获得稳定且较高的查询性能,并且,因其独特的旋转规则,红黑树比传统的AVL自平衡二叉树效率更高,通过牺牲掉非严格的平衡(即所有节点的左右子树高度差不超过1)来换取更少且稳定的旋转,任何一次插入或删除导致的不平衡在3次旋转/调整内变可以完成。原创 2023-11-29 09:08:08 · 1374 阅读 · 0 评论 -
数据结构与算法面试分享(六):排序算法
排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。原创 2023-12-08 09:12:47 · 945 阅读 · 0 评论 -
数据结构与算法面试分享(五):递归
简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。原创 2023-12-08 09:07:15 · 898 阅读 · 0 评论 -
数据结构与算法面试分享(四):栈
栈的介绍栈的英文为(stack)栈是一个**先入后出(FILO-First In Last Out)**的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除图解方式说明出栈(pop)和入栈(push)的概念原创 2023-12-08 09:05:13 · 973 阅读 · 0 评论 -
数据结构与算法面试分享(三):链表
链表是以节点的方式来存储,是链式存储每个节点包含 data域, next域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定原创 2023-12-08 08:55:13 · 956 阅读 · 0 评论 -
数据结构与算法面试分享(二):稀疏数组和队列
稀疏数组基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模原创 2023-12-08 08:48:47 · 903 阅读 · 0 评论 -
数据结构与算法面试分享(一):数据结构内容介绍
数据结构和算法的重要性算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算一般来讲程序会使用了内存计算框架(比如Spark)和缓存技术(比如Redis等)来优化程序,再深入的思考一下,这些计算框架和缓存技术,它的核心功能是哪个部分呢?拿实际工作经历来说,在Unix下开发服务器程序,功能是要支持上千万人同时在线,在上线前,做内测,一切OK,可上线后,服务器就支撑不住了,公司的CTO对代码进行优化,再次上线,坚如磐石。你就能感受到程序是有灵魂的,就是算法。目前程序员面试的门槛越来越高,很多原创 2023-12-08 08:42:58 · 919 阅读 · 0 评论