- Java207
- 编程14
- 设计78
- DevOps8
- 数据结构和算法16
- 数据库108
- 网络19
- 分布式76
- 大数据33
- 软件工程3
- 工作8
- 笔记47
- JavaCore64
- JavaEE15
- 软件20
- 工具37
- 框架68
- 中间件9
- 编程范式4
- 编程语言3
- Python6
- 架构31
- 设计模式27
- 重构7
- DDD2
- UML4
- 综合20
- 监控2
- 线性表4
- 树6
- 数据库综合3
- 数据库中间件4
- 关系型数据库18
- 文档数据库12
- KV数据库19
- 列式数据库14
- 搜索引擎数据库24
- 网络综合8
- 网络协议6
- 网络技术4
- 操作系统13
- 操作系统应用2
- 分布式综合3
- 分布式理论12
- 分布式协同14
- 分布式调度7
- 分布式高可用1
- 分布式通信31
- 分布式存储7
- hadoop7
- hive8
- spark1
- flink9
- 其他15
- 人工智能1
- 基础特性18
- 高级特性7
- 容器7
- IO9
- 并发11
- JVM9
- 面试11
- JavaWeb6
- 服务器8
- 构建9
- IDE4
- 监控诊断6
- JavaBean2
- 模板引擎4
- 测试5
- Spring61
- ORM3
- 安全8
- 缓存5
- 流量控制2
- 微服务5
- 解决方案8
- Git3
- Shardingsphere2
- Mysql10
- MongoDB11
- Redis17
- HBase12
- Elasticsearch15
- Elastic8
- Linux11
- 命令1
- 分布式协同综合7
- ZooKeeper6
- RPC8
- MQ17
- hdfs4
- 效能6
- 方法论2
- 规范3
- Tomcat6
- Maven7
- Spring综合5
- Spring核心24
- Spring数据10
- SpringWeb8
- SpringIO4
- Spring集成4
- Spring安全1
- Spring其他4
- RPC综合4
- Dubbo2
- MQ综合2
- Kafka9
- RocketMQ4
- 其他MQ1
复杂度分析
为什么需要复杂度分析
衡量算法的优劣,有两种评估方式:事前估计和后期测试。
后期测试有性能测试、基准测试(Benchmark)等手段。
但是,后期测试有以下限制:
- 测试结果非常依赖测试环境。如:不同机型、不同编译器版本、不同硬件配置等等,都会影响测试结果。
- 测试结果受数据规模的影响很大。
所以,需要一种方法,可以不受环境或数据规模的影响,粗略地估计算法的执行效率。这种方法就是复杂度分析。
LSM 树
什么是 LSM 树
LSM 树具有以下 3 个特点:
- 将索引分为内存和磁盘两部分,并在内存达到阈值时启动树合并(Merge Trees);
- 用批量写入代替随机写入,并且用预写日志 WAL 技术(Write AheadLog,预写日志技术)保证内存数据,在系统崩溃后可以被恢复;
- 数据采取类似日志追加写的方式写入(Log Structured)磁盘,以顺序写的方式提高写
入效率。
LSM 树的这些特点,使得它相对于 B+ 树,在写入性能上有大幅提升。所以,许多 NoSQL 系统都使用 LSM 树作为检索引擎,而且还对 LSM 树进行了优化以提升检索性能。
B+树
什么是 B+树
B+树是在二叉查找树的基础上进行了改造:树中的节点并不存储数据本身,而是只是作为索引。每个叶子节点串在一条链表上,链表中的数据是从小到大有序的。
改造之后,如果我们要求某个区间的数据。我们只需要拿区间的起始值,在树中进行查找,当查找到某个叶子节点之后,我们再顺着链表往后遍历,直到链表中的结点数据值大于区间的终止值为止。所有遍历到的数据,就是符合区间值的所有数据。
字典树
什么是字典树
Trie 树(又叫“前缀树”或“字典树”)是一种用于快速查询“某个字符串/字符前缀”是否存在的数据结构。
- 根节点(Root)不包含字符,除根节点外的每一个节点都仅包含一个字符;
- 从根节点到某一节点路径上所经过的字符连接起来,即为该节点对应的字符串;
- 任意节点的所有子节点所包含的字符都不相同;
跳表
什么是跳表
对于一个有序数组,可以使用高效的二分查找法,其时间复杂度为 O(log n)
。
但是,即使是有序的链表,也只能使用低效的顺序查找,其时间复杂度为 O(n)
。
红黑树
平衡二叉树
平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。
完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。
数组和链表
数组和链表分别代表了连续空间和不连续空间的存储方式,它们是线性表(Linear List)的典型代表。其他所有的数据结构,比如栈、队列、二叉树、B+ 树等,实际上都是这两者的结合和变化。
数组
数组用 连续 的内存空间来存储数据。
数组的访问
数组元素的访问是以行或列索引的单一下标表示。
图
在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。
什么是图
哈希表
哈希表 是一种使用 哈希函数 组织数据,以支持快速插入和搜索的数据结构。
有两种不同类型的哈希表:哈希集合 和 哈希映射。
- 哈希集合 是集合数据结构的实现之一,用于存储非重复值。
- 哈希映射 是映射 数据结构的实现之一,用于存储(key, value)键值对。