首页 > 技术文章 > 数组、链表、跳表

liugangjiayou 2020-02-26 23:52 原文

数组、链表、跳表

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

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

推荐阅读