首页
AI Coding
NEW
沸点
课程
直播
活动
AI刷题
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
数据结构与算法
chirpyli
创建于2021-12-03
订阅专栏
分享数据结构与算法相关的技术文章
等 2 人订阅
共22篇文章
创建于2021-12-03
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
跳跃链表
跳跃链表是有序链表的一个变种,在一个有序链表中,查找一个链表中的元素需要进行一次遍历,时间复杂度为O(n),为了加快查找的过程,能够跳过某些元素呢?一个思路就是牺牲一定的空间换时间,对有序链表建立类似索引的结构加快查找过程,跳跃链表基本上就是通过维护一个多层次的链表,每一层链表…
堆排序
选择排序的基本思路是:每次都从原序列中顺序查找出最小的元素,放入新的序列的下一个位置(在具体实现中,一般是还是放在原序列中,采用依次交换位置的方法)。这种最简单实现的选择排序时间复杂度为。有没有效率更高的基于选择的排序算法呢?堆排序就是一种,与选择排序一样,堆排序是每次从原序列…
STL堆实现
堆是十分重要的数据结构,我们常用的优先队列就是基于堆实现的数据结构,堆排序也是基于堆实现的,所以,我们要理解堆的实现,之前自己根据堆的原理自己实现了堆,现在来分析一下STL中堆的实现代码,STL的堆实现相比自己实现的代码肯定要多很多,但原理是一样的,我们下面看一下。 STL中提…
STL关联容器
这里简单学习一下STL关联容器,主要是map、multimap、set、multiset以及unordered_map。前四个底层实现都是利用红黑树实现的,查找算法时间复杂度为O(log(n)),而unordered_map从名字上就知道是无序容器,其实现原理类似哈希表,查找算…
STL常用序列容器
这里简要的记述一下STL常用容器的实现原理,要点等内容。 vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而array是静态空间,分配后不能动态扩展。vecotr的实现较为简单,主要的关键点在于当空间不足时,…
数据结构:自组织链表
引入跳跃链表的目的是为了加速查找过程。而加速策略其中一个非常重要的观点就是并非所有的元素使用的频率都相同。我们自然希望高频使用的元素在链表的头部,而低频的在链表尾部。单向链表和双向链表需要进行顺序查找以定位某个元素,还可以用某种方法动态地组织链表,从而提高查找效率。有许多不同的…
数据结构:稀疏表
在许多应用中,表似乎是最自然的一种选择,但有时出于对空间的考虑,就有可能放弃这种选择。当只用表的一小部分时尤其如此,这种类型的表称为稀疏表(sparse table),因为表中只是稀疏地放置了一些数据,它的大部分单元都是空的。此时可以用链表代替表。 举个例子,大学里有几千名学生…
数据结构:红黑树
红黑树是一种自平衡二叉查找树,可以在时间内完成查找、插入和删除。相对于AVL树来说,牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树。红黑树较AVL树等二叉树的不同在于其有个标识位(红色或者黑色),这个标识位的作用在于减少因不平衡造成的旋转操作,…
数据结构:堆
堆是一种特别的树状数据结构。若满足以下特性,即可称为堆:“给定堆中任意节点P和C,若P是C的父节点,那么P的值会小于等于(或大于等于)C的值”。若父节点的值恒小于等于子节点的值,此堆称为最小堆;反之,称为最大堆。 任意节点小于等于(或大于等于)它的子节点,最小元(或最大元)在堆…
最短路径算法:Bellman-ford算法
在图结构中,求解最短路径问题有多种算法,Bellman-Ford是其中之一,它可以处理含有负权边的情况,同样是单源最短路径算法,而之前讲到的Dijkstra算法不能处理含有负权边的情况。对应的代价就是其算法时间复杂度要高一些。后面我们会分析。 在继续往下讲之前,先补充一个图最短…
AVL树
在二叉查找树的相关操作中,例如,插入、查找、删除、最大值、最小值等的时间复杂度为O(h),为了避免算法的最坏情况,我们应当使二叉树平衡,以降低树的高度。DSW算法能够实现树的平衡,但有其局限性,只能做全局的平衡,当节点又有变化时,需要重新进行平衡(这个平衡的过程代价较大,等于是…
二叉查找树的Morris遍历算法
二叉查找树的遍历方法有多种,递归实现,利用栈实现,线索树实现,这几种遍历方法,其时间复杂度都为O(n),而空间复杂度递归和栈为O(h),线索树需要额外的标识位来表明是线索还是节点指针,空间复杂度为O(n),当节点数量非常大时,树高h = log(n)仍然较大,有没有其他的遍历算…
Dijkstra算法
在图的应用中,最常用的就是求解各种条件下的最短路径问题,这里Dijkstra迪杰斯特拉算法是求解有权(权值为非负值)图的单源最短路径算法,即只能求出某点到其它点最短距离,并不能得出任意两点之间的最短距离。 可以看到Dijkstra算法核心思想是每次都从距离值最短的顶点开始探索最…
数据结构——图的表示与遍历
图是非常重要的数据结构,现实中的很多问题都归结于图的问题,这里我们讨论一下图,关于图的基础:顶点、边等概念可参考文档:Graph Data Stucture,这里不再细述。 图有两种表示方法:邻接矩阵、邻接链表。不同的场景及算法可能需要不同的图表示方式,一般情况下当结点数量非常…
二叉查找树的平衡(DSW)
树适合于表示某些领域的层次结构(比如Linux的文件目录结构),使用树进行查找比使用链表快的多,理想情况下树的查找复杂度O(log(N)),而链表为O(N),但理想情况指的是什么情况呢?一般指树是完全平衡的时候。哪最坏的情况是什么呢?就是树退化为链表的时,这时候查找的复杂度与链…
二叉查找树(BST)
树和图是两大类常用的数据结构,在树这一类数据结构中,二叉查找树是掌握后续各种树(比如多叉树)的基础,所以,我们先学习二叉查找树。看一下二叉查找树是怎么实现的,怎么实现常规的插入、删除、查找等操作。 二叉树:节点可以包含两个子节点(也可能为空)的树,每一个子节点都区分为左子节点或…
Merkle树
在分布式系统、P2P应用中或者是区块链中,会经常使用一种数据结构Merkle tree(默克尔树),这里我们将详细讨论一下这个常用数据结构。 在构造Merkle树时,首先要对数据块计算哈希值,通常,选用SHA-256等哈希算法。但如果仅仅防止数据不是蓄意的损坏或篡改,可以改用一…
Bloom过滤器
思考这个问题的时候,最先想到的可能是哈希表,在数据集规模较小的时候,这个方法是可行的,当然,数据集巨大的时候也可以采用分布式哈希表的方式。当数据集规模较大时,尤其是应用中只需要判断一个元素不在此数据集中的情况时,我们可以借鉴哈希表的思路,使用Bloom过滤器解决这个问题。既然我…
哈希表原理
哈希表是最常用的数据结构之一,对于其用法,大家都非常熟悉,这里详细探讨一下其原理。哈希表的底层实际上是基于数组来存储的,当插入键值对时,并不是直接插入该数组中,而是通过对键进行Hash运算得到Hash值,然后和数组容量取模,得到在数组中的位置后再插入。取值时,先对指定的键求Ha…
数论——同余式、剩余类
【定义】任给,如果和相差一个的倍数,即,就说与模同余,记为,并称为同余式的模。 这里,可表示为,所以. 整数与模同余当且仅当它们被除所得的余数相同. 且, a\equiv c\ (\mod\ m)" class="equation" src="https://juejin.im…
下一页