【数据结构与算法入门】

时间复杂度 跳转

O代表了运行时间函数的一个渐进上界,即T(n)在数量级上小于等于f(n)

  • 大小关系
    在这里插入图片描述
  • 计算方法:
    一、得出运行时间的函数
    二、对函数进行简化
    • ①用常数1来取代运行时间中所有加法常数
    • ②修改后的函数中,只保留最高阶项
    • ③如果最高阶项存在且不是1,则忽略这个项的系数
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

数组

  • 查找:采用二分法可以在 O(logn) 的时间里找到指定的元素。
  • 数组在插入、删除这些操作中比较不友好,找到目标位置所需时间为 O(logn) ,进行插入和删除这个动作所需的时间复杂度为 O(n) ,因为都需要移动移动元素,所以最终所需要的时间复杂度为 O(n) 。
  • 插入/删除:O(n)

在这里插入图片描述

链表

  • 查找:不能像数组那样采用二分查找的方式,只能一个一个结点遍历,为O(n)。
  • 当我们找到目标位置之后,插入、删除元素所需的时间复杂度为 O(1)
  • 加上查找所需的时间,插入、删除所需的总的时间复杂度为O(n)。

队列

跳跃表 跳转

那链表的查找速度可以提高吗?
对于下面这个链表
在这里插入图片描述
由于元素是有序的,我们是可以通过增加一些路径来加快查找速度的。
我们可以先通过比较上面一层的元素来确定目标元素所在区间,通过这种方法,我们只需要遍历 5 次就可以找到元素 9 了(红色的线为查找路径)。

在这里插入图片描述
还能继续加快查找速度吗?答是可以的,再增加一层就行了。
在这里插入图片描述

在这里插入图片描述

  • 对于具有 n 个元素的链表,我们可以采取 (logn + 1) 层指针路径的形式,就可以实现在 O(logn) 的时间复杂度内,查找到某个目标元素了。
  • 这种数据结构,我们也称之为跳跃表,跳跃表也可以算是链表的一种变形,只是它具有二分查找的功能。

1.插入与删除

  • 新插入的结点应该跨越多少层:
    通过抛硬币来决定新插入结点跨越的层数:每次我们要插入一个结点的时候,就来抛硬币,如果抛出来的是正面,则继续抛,直到出现负面为止,统计这个过程中出现正面的次数,这个次数作为结点跨越的层数。
    通过这种方法,可以尽可能着接近理想的层数.

(1)插入。

  • 例如,我们要插入结点 3,4,通过抛硬币知道3,4跨越的层数分别为 0,2 (层数从0开始算),则插入的过程如下:
    1.插入 3,跨越0层。
    2.插入 4,跨越2层。
    在这里插入图片描述

(2)删除

  • 例如我们要删除4,那我们直接把4及其所跨越的层数删除就行了。
    在这里插入图片描述
    (3)总结
  • 跳跃表的每一层都是一条有序的链表。
  • 跳跃表的查找次数近似于层数,时间复杂度为O(logn),插入、删除也为 O(logn)。
  • 最底层的链表包含所有元素。
  • 跳跃表是一种随机化的数据结构(通过抛硬币来决定层数)。
  • 跳跃表的空间复杂度为 O(n)。

(4)对比

  • 跳跃表 vs 二叉查找树

    • 二叉查找树的插入、删除、查找也是近似 O(logn) 的时间复杂度。
    • 不过,二叉查找树是有可能出现一种极端的情况的,就是如果插入的数据刚好一直有序,那么所有节点会偏向某一边。会导致二叉查找树的查找效率变为 O(n),这会使二叉查找树大打折扣。
      在这里插入图片描述
  • 跳跃表 vs 红黑树

    • 红黑可以说是二叉查找树的一种变形,红黑在查找,插入,删除也是近似O(logn)的时间复杂度。
    • 红黑树插入,删除结点时,是通过调整结构来保持红黑树的平衡,比起跳跃表直接通过一个随机数来决定跨越几层,在时间复杂度的花销上是要高于跳跃表的。
维护一组有序的集合,并且希望在查找、插入、删除等操作上尽可能快,那么跳跃表会是不错的选择。
redis中的数据便是采用了跳跃表,当然,ridis也结合了哈希表等数据结构,采用的是一种复合数据结构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值