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)