是否存在用于搜索具有复杂度O(log(k))的跳过列表中的元素的算法

时间:2018-05-21 06:01:29

标签: algorithm data-structures time-complexity skip-lists

我在大学完成了一项非常简单的家庭作业,但仍无法解决问题: 对于给定值 X ,这是跳过列表中的第一个出现是索引 k ,创建一个在索引 X 的算法> k ,复杂度 O(log(k))。 我之前看到有人问起这个问题,但没有问题得到清楚和可理解的回答。我只是想不出办法来做到这一点。在一个简单的数组中搜索时间 O(log(k))的元素有一个非常容易理解的解决方案,其中应用了指数搜索。 如果有人能够描述算法本身及其使用的想法,我将非常感激。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

首先,浏览转发指针,找到可以通过 X 遍历的最高指针。这需要 O(log k)

然后,像往常一样继续搜索,从该指针开始而不是最高指针。这也需要 O(log k)

提供 O(log N)搜索的大多数数据结构也支持对此类附近元素的优化搜索,至少在您从两端开始时都是如此。它被称为“手指搜索”:https://en.wikipedia.org/wiki/Finger_search

答案 1 :(得分:-1)

根据http://bigocheatsheet.com/搜索跳过列表是O(log(n))。

除了wiki(https://www.geeksforgeeks.org/skip-list-set-3-searching-deletion/)伪代码之外的另一个有用资源是:

Search(list, searchKey)
x := list -> header
-- loop invariant: x -> key  level downto 0 do
    while x -> forward[i] -> key  forward[i]
x := x -> forward[0]
if x -> key = searchKey then return x -> value
else return failure