数组、链表、跳表的基本实现和特性

一、数组
1.底层实现
由内存管理器去内存中申请一段连续的地址,可以通过内存管理器去直接访问开辟的地址;
2.基本特性
a.可以随机地进行访问;
b.删除添加操作比较麻烦,需要O(n)的时间复杂度;
3.ArrayList源代码(不适合大量的插入、删除操作)
a.指定位置的插入:完成一些前期查询工作后,需要将后部数组中的数据进行移动;
System.arraycopy(source,sourcePos,destination,destinationPos,length):第一个参数时原数组,第二个参数时要复制的原数组的起始位置,第三个参数是目标数组,第四个参数是要复制到目标数组的起始位置,第五个参数是要复制的元素的长度;
二、链表(LRU缓存的实现)
1.适用于大量插入、删除操作;
2.单链表、双向链表(有前指针和后指针)、循环链表(尾指针指向头结点);
3.链表的删除、插入和增加操作时间复杂度为O(1),但是访问复杂度为O(n);
三、跳表(链表的优化数据结构)—>redis中的实现
1.在redis中大量使用,以理解工作原理为主;
2.加速链表的查看操作(升维,用空间换时间);
添加索引;增加logn个索引;
数组、链表、跳表的基本实现和特性

3.跳表的时间复杂度分析
第K级索引节点的个数是n/(2k),假设索引有h级,最高级的索引有2个结点。n/(2h) = 2,求得 h = log2(n)-1,由于查询的次数等于索引的级数,所以它的时间复杂度为log2(n);
4.跳表空间复杂度分析
n/2+n/4+…—>空间复杂度为O(n)