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