数组、链表与哈希表:数据结构的奥秘
1. 序列的数组与链表表示
在数据结构的领域中,有一些算法已经存在了很长时间,它们的起源难以追溯到某一个特定的发明者。其中,均摊分析的概念和算法分析一样古老,在20世纪80年代,Brown、Huddlestone、Mehlhorn、Sleator和Tarjan等人引入了银行账户和势能方法。
有一种类似数组的数据结构,它能在常数时间内实现索引访问,并且插入和删除任意元素的均摊时间复杂度为O(√n)。其实现技巧相对简单,将数组分割成大小为n′ = Θ(√n)的子数组,只有最后一个子数组可能包含较少的元素。这些子数组被维护为循环数组。要查找元素i,可在子数组⌊i/n′⌋的第i mod n′个位置找到它。插入新元素时,将其插入到对应的子数组中,时间复杂度为O(√n)。为了保持子数组大小的一致性,会将该子数组的最后一个元素插入到下一个子数组的开头,这个过程会重复O(n/n′) = O(√n)次,直到到达最后一个子数组。删除操作的原理类似。偶尔,需要创建一个新的最后子数组,或者改变n′的值并重新分配所有内容,但这些额外操作的均摊成本可以控制得很小。通过一些额外的修改,所有双端队列操作都能在常数时间内完成。
2. 哈希表与关联数组
想象一下,如果你想从卡尔斯鲁厄理工学院(KIT)的中央图书馆借一本书,你需要提前预订。图书馆工作人员会从书架上取出书,并将其送到一个有100个书架的房间,你可以根据图书馆卡号的最后两位数字在相应的书架上找到你的书。为什么是最后两位数字而不是前几位呢?这是因为这样能使书籍更均匀地分布在各个书架上。学生注册时,图书馆卡号是连续编号的,同一时期入学的学生卡号前几位很可能相同,如果使用前几位数字,可能只有少数几个书
超级会员免费看
订阅专栏 解锁全文
179

被折叠的 条评论
为什么被折叠?



