数组链表跳表

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

以上是关于数组链表跳表的主要内容,如果未能解决你的问题,请参考以下文章

算法学习——数组链表跳表的基本实现与特性

LSM-Tree - LevelDb Skiplist跳表

redis为什么要使用skiplist跳表

搜索引擎索引倒排索引哈希表跳表

Redis数据结构

Redis数据结构