数据结构与算法
学习数据结构与算法的理论知识,然后在LeetCode上练习对应的编程,以提高编程能力。数据的逻辑结构和物理结构是密切相关的,在学习数据的过程中会发现,任何一个算法的设计取决于选定的数据逻辑结构,而算法的实现依赖于所采用的存储结构。
木绿
这个作者很懒,什么都没留下…
展开
-
Trie树:实现搜索引擎的搜索关键词提示功能
快速查找某个字符串的功能。比如,我们有6个字符串,它们分别是:how,hi,her,hello,so,see。我们希望在里面多次查找某个字符是否存在。我们可以先对这6个字符串做一下预处理,组织成Trie树的结构,之后每次查找,都是在Trie树中进行匹配查找。Trie树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。其中,根节点不包含任何信息。每个节点表示一个字符串中的字符,...原创 2020-04-02 14:05:26 · 483 阅读 · 0 评论 -
图
如何理解图图和树比起来是一种更加复杂的非线性表结构。树中的元素我们称为节点,图中的元素我们叫做顶点。从图中可以看出来,图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫做边。顶点的度:与顶点相连的边的条数。比如微信,我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好...原创 2020-03-26 13:11:33 · 94 阅读 · 0 评论 -
堆
堆是一种特殊的树,数只要满足这两点,它就是堆:堆是一个完全二叉树;完全二叉树要求,除最后一层,其它层的节点个数都是满的,最后一层的节点都靠左排列。堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。也可以说,堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,我们叫作“大顶堆”。对于每个节点的值都小于等于子树中每...原创 2020-03-23 11:26:14 · 292 阅读 · 0 评论 -
递归树
比如一棵斐波那契数列的递归树,节点里的数字表示数据的规模,一个节点的求解可以分解为左右子节点两个问题的求解。如何用递归树来求解时间复杂度比如归并排序算法,我们把它画成递归树,就是下面这个样子:因为每次操作都是一分为二,所以代价很低,我们把时间上的消耗记作常量1。归并算法中比较耗时的是归并操作,也就是把两个子数组合并为大数组。从图中可以看出,每一层归并操作消耗的时间总和是一样的,跟要排序的...原创 2020-03-19 14:41:35 · 145 阅读 · 0 评论 -
红黑树
平衡二叉查找树定义:二叉树中任意一个节点的左右子树的高度相差不能大于1。平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对称”、比较“平衡”,不要出现左子树很高、右子树很矮的情况。这样就能让整棵树的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些。红黑树它是一种不严格的平衡二叉查找树。红黑树中的节点,一类被标记为黑色,一类被标记为红色。除此之外,一颗红黑树还...原创 2020-03-19 14:14:58 · 250 阅读 · 0 评论 -
二叉查找树
二叉查找树(二叉搜索树)是二叉树中最常用的一种类型。它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据。这都依赖于二叉查找树的特殊结构:它要求在树的任意一个节点,其左子树的每个节点的值都要小于这个节点的值,而右子树节点的值都应大于这个节点的值。如下图所示:二叉查找树的查找操作我们先取根节点,如果它等于我们要查找的数据,那就返回。如果要查找的数据比根节点的值小,那就在左子树中递...原创 2020-03-14 12:42:40 · 2349 阅读 · 2 评论 -
树
这里面的每个元素叫做“节点”,用来连接相邻节点之间的关系,叫做“父子关系”。如图所示,A节点就是B节点的父节点,B节点是A节点的子节点;B,C,D这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点;没有父节点的节点叫做根节点,即图中的节点E。没有子节点的节点叫做叶子节点或者叶节点,即图中的G,H,I,J,K,L;关于“树”,还有三个比较相似的概念:高度(Height)/深度(...原创 2020-03-14 11:46:37 · 214 阅读 · 0 评论 -
散列表和链表的组合使用以及哈希算法的应用
因为散列表是动态数据结构,不停地有数据的插入/删除,所以每当我们希望按顺序遍历散列表中的数据的时候,都需要先排序,那效率势必会很低。为了解决这个问题,我们将散列表和链表结合在一起使用。比如缓存中的插入/删除/查找操作,如果单纯的用链表的话,时间复杂度只能是O(n)。如果我们将散列表和链表两种数据结构组合使用,可以将这三个操作的时间复杂度都降低到O(1)。哈希算法/散列算法优秀的哈希算法需要...原创 2020-03-12 15:16:58 · 229 阅读 · 0 评论 -
跳表、散列表
跳表它是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作。对于一个存储数据有序的单链表来说,我们可以通过建立索引提高查找效率,降低查找的时间复杂度。这种链表加多级索引的结构,就是跳表。在跳表中查询任意数据的时间复杂度是O(logn)。这个查找的时间复杂度与二分查找是一样的,换句话说,我们基于单链表实现了二分查找。不过,这种查询效率的提升,前提是建立了很多级...原创 2020-03-10 14:35:06 · 332 阅读 · 0 评论 -
二分查找
二分查找在以下数据集中找到大小为19的元素,查找过程:二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。二分查找是一种非常高效的查找算法,它的时间复杂度时O(logn)。像O(logn)这种对数时间复杂度,有时甚至比时间复杂度时常量级O(1)的算法还要高效。因为用大O标记法...原创 2020-03-08 11:47:27 · 177 阅读 · 0 评论 -
排序算法(三)
时间复杂度为O(n)的排序算法叫作线性排序,比如桶排序、计数排序、基数排序。这三个算法是非基于比较的排序算法,都不涉及元素之间的比较操作,但对要排序的数据要求很苛刻。桶排序核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据先单独进行排序。桶内排完序后,把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。桶排序对排序数据的要求:1.首先, 要排序的数据需要很容易就能划分成m个...原创 2020-03-07 23:40:17 · 112 阅读 · 0 评论 -
排序算法(二)
冒泡、插入和选择排序,他们的时间复杂度都是O(n^2),比较高,适合小规模数据的排序。归并排序和快速排序的时间复杂度为O(nlogn),这两种排序算法适合大规模的数据排序,要更常用。归并排序和快速排序都用到了分治思想,可以借鉴这个思想,来解决非排序的问题,比如:如何在O(n)的时间复杂度内找一个无序数组中的第K大元素?归并排序的原理如果要对一个数组进行排序,我们先把数组从中间分成前后两部分...原创 2020-03-06 21:01:02 · 101 阅读 · 0 评论 -
排序算法(一)
如何分析一个排序算法?排序算法的执行效率最好情况、最坏情况、平均情况时间复杂度在分析排序算法的时间复杂度时,要分别给出最好情况、最坏情况、平均情况下的时间复杂度。除此以外,还要说出最好、最坏时间复杂度对应的要排序的原始数据时什么样的。因为有序度不同的数据,对于排序的执行时间肯定是有影响的,我们要知道排序算法在不同数据下的性能表现。时间复杂度的系数、常数、低阶时间复杂度反映的是数据...原创 2020-03-06 15:17:47 · 164 阅读 · 0 评论