数组链表跳表
Posted liugangjiayou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组链表跳表相关的知识,希望对你有一定的参考价值。
数组、链表、跳表
数组、链表、跳表基本实现和特性
Array(数组)
- java,c++: int a[100];//初始化的时候先定义好容量
- Python: list=[]//直接定义一个数组
- javascript: let x=[1,2,3]
时间复杂度
方法 | 复杂度 |
---|---|
prepend | O(n) |
append | O(1) |
lookup | O(1) |
insert | O(n) |
delete | O(n) |
成员函数
- 元素访问
- at?访问指定元素,同时进行越界检查
- operator[]?访问指定的元素
- front?访问第一个元素
- back?访问最后一个元素
- data?返回指向内存中数组第一个元素的指针
- 迭代器
- begin?返回容器第一个元素的迭代器
- end?返回指向容器尾端的迭代器
- rbegin?返回指向容器最后元素的逆向迭代器
- rend?返回指向前端的逆向迭代器
- 容量
- empty?检查容器是否为空
- size?返回容纳元素数
- max_size?返回可容纳的最大元素数
- 操作
- fill?以指定值填充容器
- swap?交换内容
链表
class Node {
int data;
Node next;
}
class LinkedList {
Node head; /
Node (int d) { data = d;}
}
时间复杂度
方法 | 复杂度 |
---|---|
prepend | O(1) |
append | O(1) |
lookup | O(n) |
insert | O(1) |
delete | O(1) |
成员函数
- 元素访问
- front?访问第一个元素
- back?访问最后一个元素
- 迭代器
- begin?返回指向容器第一元素的迭代器
- end?返回指向容器尾端的迭代器
- rbegin?返回指向容器尾端的迭代器
- rend?返回指向前端的逆向迭代器
- 容量
- empty?检查容器是否为空
- size?返回容纳的元素数
- max_size?返回可容纳的最大元素数
- 修改器
- clear?清除内容
- insert?插入元素
- emplace?原位构造元素
- erase?擦除元素
- push_back?将元素添加到容器末尾
- emplace_back?在容器末尾就地构造元素
- pop_back?移除末元素
- push_front?插入元素到容器起始
- emplace_front?在容器头部就地构造元素
- pop_front?移除首元素
- resize?改变容器中可存储元素的个数
- swap?交换内容
- 操作
- merge?合并二个已经排序列表
- splice?从另一个list中移动元素
- remove/remove_if?移除满足特定标准的元素
- reverse?将该链表的所有元素的顺序反转
- unique?删除连续的重复元素
- sort?对元素进行排序
跳表
时间复杂度
跳表查询的时间复杂度分析:
n/2、n/4、n/8、第k级索引结点的个数就是n/(2^k) 假设索引有h级,最高级的索引有2个结点。
n/(2^h) = 2,从而求得 h = log2(n) - 1- 时间复杂度 O(logn)
- 优化
- 升维 :空间换时间
- 应用
- LRU Cache - Linked list: LRU 缓存机制
Redis - Skip LIst
栈
1.Stack:先入后出;添加、删除皆为O(1)
2.查询为 O(n)时间复杂度
方法 复杂度 Access O(n) Search O(n) Insertion O(1) Deletion O(1) 成员函数
- 优化
- 元素访问
- top?访问栈顶元素
- 容量
- empty?检查底层的容器是否为空
- size?返回容纳的元素数
- 修改器
- push?向栈顶插入元素
- emplace?于顶原位构造元素
- pop?删除栈顶元素
- swap?交换内容
队列
1.Queue:先入先出;添加、删除皆为O(1)
2.查询为 O(n)
时间复杂度
方法 | 复杂度 |
---|---|
Access | O(n) |
Search | O(n) |
Insertion | O(1) |
Deletion | O(1) |
成员函数
- 元素访问
- front?访问第一个元素
- back?访问最后一个元素
- 容量
- empty?检查底层的容器是否为空
- size?返回容纳的元素数
- 修改器
- push?像队列尾部插入元素
- emplace?于尾部原位构造元素
- pop?删除栈顶元素
swap?交换内容
扩展
- 双端队列
- 简单理解:两端可以进出的
- 插入和删除都是O(1)操作
- QueueDeque - double ended queue
- 优先队列
- 插入操作:O(1)
- 取出操作:O(logN) - 按照元素的优先级取出
- 底层具体实现的数据结构较为多样和复杂:heap、bst(二叉搜索树)、treap
以上是关于数组链表跳表的主要内容,如果未能解决你的问题,请参考以下文章