1 数组

1.1 特点

(1)申请数组时Memory Controller在内存中给你开辟一块连续的内存地址
算法刻意练习之数组、链表、跳表

(2)通过访问Memory Controller来访问数组,复杂度是O(1)

(3)可以随机访问任何一个元素;

(4)问题在于 插入 和 删除 频繁的情况下, 数组不好用。因为插入和删除需要挪动元素O(1)或O(n), 然后给数组最后一位设置为空来触发GC、O(n)

1.2 演示

(1)增加元素图示
算法刻意练习之数组、链表、跳表
(2)删除元素图示
算法刻意练习之数组、链表、跳表
算法刻意练习之数组、链表、跳表

1.3 时间复杂度

算法刻意练习之数组、链表、跳表

2 链表

1.1 特点

(1)链表标准实现
算法刻意练习之数组、链表、跳表
算法刻意练习之数组、链表、跳表
(2)next 指向下一个元素,多个元素串到一起就像类数组的结构;

(3)只有一个指针叫 单链表两个指针叫 双向链表;头指针用 Head 表示,尾指针用 Tail 表示;最后一个元素的 next 指向 None;如果最后一个元素的 next 指向 Head 就叫 循环链表

算法刻意练习之数组、链表、跳表
(4)双向链表、双端(双向)链表、循环(双向)链表 示意(简)图
算法刻意练习之数组、链表、跳表

(5)应用场景:LRU Cache - Linked list
https://www.jianshu.com/p/b1ab4a170c3c、https://leetcode-cn.com/problems/lru-cache

1.2 演示

(1)增加节点
算法刻意练习之数组、链表、跳表
(2)删除节点
算法刻意练习之数组、链表、跳表

1.3 时间复杂度

算法刻意练习之数组、链表、跳表

3 跳表

3.1 特点

(1)跳表(skip list)对标的是平衡树(AVL Tree)和二分查找,是一种 插入/删除/搜索 都是 O(log n) 的数据结构。

(2)只能用于元素有序的情况

(3)应用场景:Redis - Skip List
https://redisbook.readthedocs.io/en/latest/internaldatastruct/skiplist.html、https://www.zhihu.com/question/20202931

3.2 如何给链表加速

(1)普通链表时间复杂度:查询 O(n),贯穿所有数据结构与算法的中心思想,务必记住:1、升维度;2、空间换时间

(2)

算法刻意练习之数组、链表、跳表
算法刻意练习之数组、链表、跳表
算法刻意练习之数组、链表、跳表

3.3 时间/空间复杂度

算法刻意练习之数组、链表、跳表
算法刻意练习之数组、链表、跳表

相关文章: