块状链表

介绍

有时候我们需要设计这样一种数据结构:它能快速在要求位置插入或者删除一段数据。先考虑两种简单的数据结构:数组和链表。数组的优点是能够在O(1)的时间内找到所要执行操作的位置,但其缺点是无论是插入或删除都要移动之后的所有数据,复杂度是O(n)的。链表优点是能够在O(1)的时间内插入和删除一段数据,但缺点是在寻找操作位置时,却要遍历整个链表,复杂度同样时O(n)的。这两种数据结构各有优缺点,我们可以把数组和链表的优点结合来,这就构成了一个新的数据结构:块状链表,结合数组和链表的优缺点的块状链表其各种操作的时间复杂度均为O(sqrt(n))。
从总体上来看,维护一个链表,链表中的每个单元中包含一段数组,以及这个数组中的数据个数。每个链表中的数据连起来就是整个数据。设链表长度为a,每个单元中的数组长度是b。无论是插入或删除,在寻址时要遍历整个链表,复杂度是O(a); 对于插入和删除操作,需要移动数组的元素,所以总的复杂度是O(a+b)。因为ab=n,取a=b=√n,则总的复杂度是O(√n)。
问题是如何维护a和b大致等于√n?
在执行插入操作后,如果当前单元中的数据个数>2√n,则将当前单元分割成两个新单元,每个单元中的数据个数保持为√n。在执行删除操作后,如果当前单元和当前单元的下一个单元的数据个数和<√n,则将两个单元合并成一个新单元。执行上述维护操作需要移动数组中的数据,复杂度是O(b),对于单元的分割和合并均是O(1)的,总的复杂度是O(b)的。这样,维护操作并不会使总复杂度增加。最终得到一个复杂度是O(√n)的数据结构。

在STL中,deque内部就是使用块状链表保证在首尾能够快速插入。并能够以索引的方式查找元素。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,225评论 0 12
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,486评论 1 3
  • 本文内容取自于小甲鱼的数据结构与算法。http://www.jianshu.com/p/230e6fde9c75 ...
    阿阿阿阿毛阅读 2,946评论 0 7
  • 烟灰曾经是火焰 燃烧过沸腾过 但此刻他们已安静了 他们毫不张扬的聚精会神的 等着下一次的乘风而起 携带着全部的能量...
    沫小草阅读 460评论 0 0
  • 高贵 世上有多少对与不对, 爱恨交加的感情错觉。 装得高贵的身心疲惫, 绅士般的按顺序排队。 人们所说的品...
    生来彷徨ii阅读 301评论 0 2