数组、链表、跳表

数组、链表、跳表

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

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

原文地址:https://www.cnblogs.com/liugangjiayou/p/12369998.html

时间: 2024-10-31 16:49:41

数组、链表、跳表的相关文章

5-5-广义表(头尾链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 广义表(头尾链表存储表示) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceString.c    

5-6-广义表(扩展线性链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 广义表(扩展线性链表存储表示) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceString.c  

5-4-十字链表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 十字链表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下载

【搜索引擎(二)】索引、倒排索引、哈希表、跳表

索引 其实在计算机中我们早已接触过跟索引有关的东西,比如数据库里的索引(index),还有硬盘文件系统中其实也有类似的东西,简而言之,索引是一种为了方便找到自己需要的东西而设计出来的条目,你可以通过找索引找到自己想要内容的位置.索引过程是: 关键字->索引->文档.在图书馆内的书分门别类,就是一种按类别来分的索引.当然索引还有很多其他的实现. 仅仅有索引的概念是不够的.虽然分门别类是一种方法,但是我们在拥有一堆文档的时候必须要有从文档到索引的规范过程,并且索引的结构要满足能够让人(或者计算机)

倒排索引优化 - 跳表

在前面一篇介绍 倒排索引 的文章中我们知道, 两个关键字的合并操作的时候复杂度是 θ(N), 如果在合并操作时遇到最极端的情况, 所扫描和比较的次数是两个列表集合的所有元素个数之和, 即是线性增长的, 这在数据量特别大的时候是很低效的. 我们还是看一下两个集合的合并操作代码示例: a = [1, 2, 3, 6, 9, 11, 45, 67] b = [4, 6, 13, 45, 69, 98] i = j = 0 result = [] while i < len(a) and j < le

存储系统的基本数据结构之一: 跳表 (SkipList)

在接下来的系列文章中,我们将介绍一系列应用于存储以及IO子系统的数据结构.这些数据结构相互关联又有着巨大的区别,希望我们能够不辱使命的将他们分门别类的介绍清楚.本文为第一节,介绍一个简单而又有用的数据结构:跳表 (SkipList) 在对跳表进行讨论之前,我们首先描述一下跳表的核心思想. 跳表(Skip List)是有序线性链表的一种.通常对线性链表进行查找需要遍历,因而不能很好的使用二分查找这样快速的方法(想像一下在链表中定位中间元素的复杂度).为了提高查找速率,我们可以将这些线性链表打散,组

跳表SkipList

原文:http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html 跳表SkipList 1.聊一聊跳表作者的其人其事 2. 言归正传,跳表简介 3. 跳表数据存储模型 4. 跳表的代码实现分析 5. 论文,代码下载及参考资料 <1>. 聊一聊作者的其人其事  跳表是由William Pugh发明.他在 Communications of the ACM June 1990, 33(6) 668-676 发表了Skip lists

《数据结构》_8跳表和散列表

跳表 跳表是一个包含n个元素的单链表,且满足以下条件: (1)在单链表的结点中,每隔2i个元素,就增加一个i级指针,0≤i≤?log2n?: (2)其头节点为Head,是一个大小为?log2n?的一维指针数组,里面只存放指向i级的第一个级指针,0≤i≤?log2n?,不存放实际数据元素,它和同i级的指针构成一个存放指针的i级单链表: (3)其尾结点为Tail,是一个可以存放实际数据元素的指针,通常该元素值设为一个较大的数值,作为查找退出的哨兵. 可以借鉴博客https://blog.csdn.n

数据结构和算法之——跳表

之前我们知道,二分查找依赖数组的随机访问,所以只能用数组来实现.如果数据存储在链表中,就真的没法用二分查找了吗?而实际上,我们只需要对链表稍加改造,就可以实现类似"二分"的查找算法,这种改造之后的数据结构叫作跳表(Skip List). 1. 何为跳表? 对于一个单链表,即使链表是有序的,如果我们想要在其中查找某个数据,也只能从头到尾遍历链表,这样效率自然就会很低. 假如我们对链表每两个结点提取一个结点到上一级,然后建立一个索引指向原始结点,如下图所示. 这时候,我们要查找某一个数据的