
数据结构与算法
文章平均质量分 92
数据结构与算法学习总结
chirpyli
数据库内核开发工程师
展开
-
Hanoi塔问题
问题描述: 有n个盘子在A处, 盘子从大到小排列,最上面的盘子最小。现在要把这n个盘子从A处搬到C处,可以在B处暂存,但任何时候都不能出现大盘子压在小盘子上面的情况。解决思路: 当只有一个盘子时,直接从A移动到C即可。如果已知n-1个盘子的移动方案,那么n个盘子的方案如下: 先把前n-1个盘子从A借助C移动到B,再把第n个盘子从A直接移动到C处,然后将B处的n-1个盘子从B借A移动到C处。代码实现: 将大盘子小盘子抽象为数字,塔抽象为栈。代码如下:use std::borrow::BorrowMut;原创 2020-11-03 10:11:24 · 1531 阅读 · 0 评论 -
数据结构:红黑树
红黑树红黑树是一种自平衡二叉查找树,可以在O(log(n))O(log(n))O(log(n))时间内完成查找、插入和删除。相对于AVL树来说,牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树。红黑树较AVL树等二叉树的不同在于其有个标识位(红色或者黑色),这个标识位的作用在于减少因不平衡造成的旋转操作,虽然此时树不是完全平衡二叉树,但依然有O(log(n)O(log(n)O(log(n)的时间效率。红黑树的性质红黑树要满足如下性质:Each node is eit原创 2020-06-02 09:30:41 · 973 阅读 · 0 评论 -
数据结构:堆
堆是一种特别的树状数据结构。若满足以下特性,即可称为堆:“给定堆中任意节点P和C,若P是C的父节点,那么P的值会小于等于(或大于等于)C的值”。若父节点的值恒小于等于子节点的值,此堆称为最小堆;反之,称为最大堆。原创 2020-06-01 11:09:17 · 1033 阅读 · 0 评论 -
最短路径算法:Bellman-ford算法
最短路径问题在图结构中,求解最短路径问题有多种算法,Bellman-Ford是其中之一,它可以处理含有负权边的情况,同样是单源最短路径算法,而之前讲到的Dijkstra算法不能处理含有负权边的情况。对应的代价就是其算法时间复杂度要高一些。后面我们会分析。这里能处理负权边是针对有向图的,因为对无向图来说,含有负权边就意味着含有负权回路,在有负权回路的这种情况下求最短路径是无解的,因为每经过一次负权回路,距离都会减少,就会无限循环下去。在继续往下讲之前,先补充一个图最短路径的一个性质:最短路径的子路径原创 2020-05-29 11:43:08 · 1800 阅读 · 0 评论 -
跳跃链表详解
跳跃链表的概念跳跃链表是有序链表的一个变种,在一个有序链表中,查找一个链表中的元素需要进行一次遍历,时间复杂度为O(n),为了加快查找的过程,能够跳过某些元素呢?一个思路就是牺牲一定的空间换时间,对有序链表建立类似索引的结构加快查找过程,跳跃链表基本上就是通过维护一个多层次的链表,每一层链表中的元素是前一层链表元素的子集,搜索时,最开始在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻元素...原创 2020-01-14 18:17:14 · 3263 阅读 · 0 评论 -
二叉查找树的Morris遍历算法
二叉查找树的遍历方法有多种,递归实现,利用栈实现,线索树实现,这几种遍历方法,其时间复杂度都为O(n),而空间复杂度递归和栈为O(h),线索树需要额外的标识位来表明是线索还是节点指针,空间复杂度为O(n),当节点数量非常大时,树高h = log(n)仍然较大,有没有其他的遍历算法,其空间效率更高呢?这就是Morris算法,其时间复杂度为O(n),空间复杂度做到了O(1)。这是较其他几种遍历方法最不...原创 2019-12-03 19:15:44 · 600 阅读 · 0 评论 -
二叉查找树的平衡(DSW)
树适合于表示某些领域的层次结构(比如Linux的文件目录结构),使用树进行查找比使用链表快的多,理想情况下树的查找复杂度O(log(N)),而链表为O(N),但理想情况指的是什么情况呢?一般指树是完全平衡的时候。哪最坏的情况是什么呢?就是树退化为链表的时,这时候查找的复杂度与链表相同。就失去了树结构的意义。所以树的平衡是非常重要的,这一节我们主要讨论树的平衡问题。如果树中任一节点的两个子树的高...原创 2019-12-02 10:07:27 · 1128 阅读 · 2 评论 -
树及其实现(C++)
树的相关概念空树:是高度为0的合法树;单一节点:是高度为1的树(是节点既是根也是叶子的唯一情况);极端情况下,树退化为链表;二叉树:节点可以包含两个子节点(也可能为空)的树,每一个子节点都区分为左子节点或右子节点。完全二叉树:所有的非终端节点都有两个子节点,所有的叶节点都位于同一层次;对于非空二叉树,若其所有的非终端节点刚好有两个非空子节点,则叶节点的数目m大于非终端节点的数目k,并且m原创 2017-07-24 23:35:05 · 1038 阅读 · 0 评论 -
哈希表原理
哈希表是最常用的数据结构之一,对于其用法,大家都非常熟悉,这里详细探讨一下其原理。哈希表的底层实际上是基于数组来存储的,当插入键值对时,并不是直接插入该数组中,而是通过对键进行Hash运算得到Hash值,然后和数组容量取模,得到在数组中的位置后再插入。取值时,先对指定的键求Hash值,再和容量取模得到底层数组中对应的位置,如果指定的键值与存贮的键相匹配,则返回该键值对,如果不匹配,则表示哈希表中没...原创 2019-07-08 18:05:07 · 12931 阅读 · 2 评论 -
Bloom过滤器
提出一个问题在我们细述Bloom过滤器之前,我们先抛出一个问题:给你一个巨大的数据集(百万级、亿级…),怎么判断一个元素是否在此数据集中?或者怎么判断一个元素不在此数据集中?思考这个问题的时候,最先想到的可能是哈希表,在数据集规模较小的时候,这个方法是可行的,当然,数据集巨大的时候也可以采用分布式哈希表的方式。当数据集规模较大时,尤其是应用中只需要判断一个元素不在此数据集中的情况时,我们可以借...原创 2019-07-10 13:35:41 · 2501 阅读 · 0 评论