我最近遇到了一种在排序列表中搜索数字的算法,结果如下:
给定:一个oracle告诉你一个给定的数字是否大于或小于被搜索的数字。
从列表中的第一个元素开始。向前跳过1个元素并询问oracle是否已经超过了被搜索的数字。
如果没有,请跳过2个元素并询问oracle是否已经走得太远。
如果没有提前跳过4个元素等等......
当您找到导致您传递搜索号码的第一个跳过时,您可以确定包含要搜索的号码的子区间。
最后,在子区间上执行二进制搜索。
我想知道这个算法被调用了什么,以便我可以对它进行更多的研究。
由于
答案 0 :(得分:4)
这就是你如何二元搜索无界集。
例如,要解决正整数上的不等式f(n) < t
,其中f是递增函数。
具体例子:
Solve n**2 + 10*n < 100 over the positive integers.
Let f(n) = n**2 + 10*n for n > 0
f is increasing because it's the sum of increasing functions.
f(1) = 1 + 10 = 11
f(2) = 4 + 20 = 24
f(4) = 16 + 40 = 56
f(8) = 64 + 80 = 144 > 100
Now we binary search the interval [4,8]
f(6) = 36 + 60 = 96
f(7) = 49 + 70 = 119 > 100
Thus n < 7
答案 1 :(得分:0)
此数据结构称为Skip Lists
跳过列表是用于存储排序的项目列表的数据结构 使用链接列表的层次结构,连接越来越稀疏 项目的后续序列。这些辅助列表允许项目查找 效率可与平衡二叉搜索树相媲美(即 探针数量与log n成比例而不是n)。
答案 2 :(得分:0)
我建议对算法进行一些修改。应该有两个迭代器一个接着另一个,当你意识到你已经移动到一个列表节点的数量大于被搜索的数字..我们应该重新启动与前一个迭代器相同的步骤..这一直持续到我们找到数字。因为我不明白怎么做二进制serch,即在log(N)时间与列表......