Algorithm 是否有一种算法用于搜索复杂度为O(log(k))的跳过列表中的元素

Algorithm 是否有一种算法用于搜索复杂度为O(log(k))的跳过列表中的元素,algorithm,data-structures,time-complexity,skip-lists,Algorithm,Data Structures,Time Complexity,Skip Lists,我在大学里做了一个相当简单的家庭作业,但仍然无法解决: 对于给定的值X(跳过列表中第一个出现的是索引k),创建一个算法,在索引k中查找X,其复杂性O(log(k))。 我以前看到人们问过这个问题,但没有一个问题得到明确和可以理解的回答。我就是想不出一个办法。有一种非常容易理解的解决方案,用于在简单数组中搜索时间O(log(k))的元素,其中应用了指数搜索。 如果有人能描述一个算法本身及其使用的思想,我将不胜感激。 提前谢谢。根据搜索,跳过列表为O(log(n)) 除了wiki()伪代码之外,另一

我在大学里做了一个相当简单的家庭作业,但仍然无法解决: 对于给定的值X(跳过列表中第一个出现的是索引k),创建一个算法,在索引k中查找X,其复杂性O(log(k))。 我以前看到人们问过这个问题,但没有一个问题得到明确和可以理解的回答。我就是想不出一个办法。有一种非常容易理解的解决方案,用于在简单数组中搜索时间O(log(k))的元素,其中应用了指数搜索。 如果有人能描述一个算法本身及其使用的思想,我将不胜感激。 提前谢谢。

根据搜索,跳过列表为O(log(n))

除了wiki()伪代码之外,另一个有用的资源是:

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

首先,检查转发指针,以找到不经过X即可遍历的最高指针。这需要O(logk)

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


大多数提供O(logn)搜索的数据结构也支持对类似这样的邻近元素进行优化搜索,至少当您从两端开始时是这样。这被称为“手指搜索”:

从技术上讲,这些问题往往不会在SO上得到回答,并且超出了范围。这实际上只是信息搜索任务:你描述的搜索不是默认的跳过列表搜索算法吗?差不多,但默认的搜索算法是从最高(最远)指针开始的。因此,你的算法是从最低指针开始的,而不是从最高指针开始的?你从最低指针开始,找到可以遍历的最高指针,然后再从那里正常进行。@MattTimmermans抱歉,我不明白。即使在转发第一个指针后,您的搜索空间现在是
k
,在该空间中搜索的复杂性仍然是
O(logn)
,对于跳过列表,级别的最大高度可以是O(logn),对吗?你不是在降低等级吧?