跳至主要內容
复杂度分析

复杂度分析

为什么需要复杂度分析

衡量算法的优劣,有两种评估方式:事前估计和后期测试。

后期测试有性能测试、基准测试(Benchmark)等手段。

但是,后期测试有以下限制:

  • 测试结果非常依赖测试环境。如:不同机型、不同编译器版本、不同硬件配置等等,都会影响测试结果。
  • 测试结果受数据规模的影响很大

所以,需要一种方法,可以不受环境或数据规模的影响,粗略地估计算法的执行效率。这种方法就是复杂度分析。


钝悟...大约 4 分钟数据结构和算法综合数据结构算法
LSM树

LSM 树

什么是 LSM 树

LSM 树具有以下 3 个特点:

  1. 将索引分为内存和磁盘两部分,并在内存达到阈值时启动树合并(Merge Trees);
  2. 用批量写入代替随机写入,并且用预写日志 WAL 技术(Write AheadLog,预写日志技术)保证内存数据,在系统崩溃后可以被恢复;
  3. 数据采取类似日志追加写的方式写入(Log Structured)磁盘,以顺序写的方式提高写
    入效率。

LSM 树的这些特点,使得它相对于 B+ 树,在写入性能上有大幅提升。所以,许多 NoSQL 系统都使用 LSM 树作为检索引擎,而且还对 LSM 树进行了优化以提升检索性能。


钝悟...大约 6 分钟数据结构和算法数据结构LSM 树
B+树

B+树

什么是 B+树

B+树是在二叉查找树的基础上进行了改造:树中的节点并不存储数据本身,而是只是作为索引。每个叶子节点串在一条链表上,链表中的数据是从小到大有序的。

img
img

改造之后,如果我们要求某个区间的数据。我们只需要拿区间的起始值,在树中进行查找,当查找到某个叶子节点之后,我们再顺着链表往后遍历,直到链表中的结点数据值大于区间的终止值为止。所有遍历到的数据,就是符合区间值的所有数据。


钝悟...大约 5 分钟数据结构和算法数据结构二叉树B+ 树
字典树

字典树

什么是字典树

Trie 树(又叫“前缀树”或“字典树”)是一种用于快速查询“某个字符串/字符前缀”是否存在的数据结构。

  • 根节点(Root)不包含字符,除根节点外的每一个节点都仅包含一个字符;
  • 从根节点到某一节点路径上所经过的字符连接起来,即为该节点对应的字符串;
  • 任意节点的所有子节点所包含的字符都不相同;
img
img

钝悟...大约 4 分钟数据结构和算法数据结构字典树
跳表

跳表

什么是跳表

对于一个有序数组,可以使用高效的二分查找法,其时间复杂度为 O(log n)

但是,即使是有序的链表,也只能使用低效的顺序查找,其时间复杂度为 O(n)

img
img

钝悟...大约 6 分钟数据结构和算法数据结构和算法跳表
红黑树

红黑树

平衡二叉树

平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。

完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。

img
img

钝悟...大约 9 分钟数据结构和算法数据结构二叉树红黑树
数组和链表

数组和链表

数组和链表分别代表了连续空间和不连续空间的存储方式,它们是线性表(Linear List)的典型代表。其他所有的数据结构,比如栈、队列、二叉树、B+ 树等,实际上都是这两者的结合和变化。

数组

数组用 连续 的内存空间来存储数据。

数组的访问

数组元素的访问是以行或列索引的单一下标表示。

img
img

钝悟...大约 10 分钟数据结构和算法线性表数据结构线性表数组链表

在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。

img
img

什么是图


钝悟...大约 3 分钟数据结构和算法数据结构和算法
哈希表

哈希表

哈希表 是一种使用 哈希函数 组织数据,以支持快速插入和搜索的数据结构。

有两种不同类型的哈希表:哈希集合哈希映射

  • 哈希集合 是集合数据结构的实现之一,用于存储非重复值。
  • 哈希映射 是映射 数据结构的实现之一,用于存储(key, value)键值对。

钝悟...大约 10 分钟数据结构和算法数据结构和算法哈希表
2