【发布时间】:2012-08-31 07:43:38
【问题描述】:
给定一个包含正整数和负整数的无限长排序数组。在其中找到一个元素。
编辑
数组中的所有元素都是唯一的,并且数组在正确的方向上是无限的。
有两种方法:
方法一:
在位置100设置索引,如果要查找的元素较少,则在前100项中进行二分查找,否则将下一个索引设置在位置200。这样,不断增加索引100,直到该项更大。
方法二:
以 2 的幂设置索引。首先将索引设置在位置 2,然后是 4,然后是 8,然后是 16,依此类推。再次从位置 2^K 到 2^(K + 1) 进行二分搜索,其中 item 介于两者之间。
在最佳情况和最坏情况下,这两种方法中哪一种更好?
【问题讨论】:
-
在处理无限集合时,“更好”是什么意思?你追求什么样的渐近线?数组在两个方向上是无限的,还是有最小的元素?元素是否独特?
-
考虑到真正的无限长度,它没有任何区别——除了偶然之外,没有人有任何成功找到元素的希望。无论您如何搜索,您能够搜索的数组的百分比是数组的某个有限数 N / infinity = 0%。
-
@JerryCoffin:还要注意,即使数组两边都是无限的,也可以很容易地简化为单边无限数组:访问任意索引(让它成为
k)。 ifx < arr[k]:在索引为(-infninity,k]的一侧无限数组中搜索。否则,搜索[k,infinity)。唯一的问题是真正的唯一性和非 Zeno 属性(整数保证) -
如果它有助于避免让任何人感到困惑,可以将“无限排序的唯一值数组”替换为“自然数的单调递增函数,由恒定时间的预言机计算。”
-
您想在时间复杂度计算中加入索引数学运算花费的时间超过 O(1) 时间吗?
标签: performance algorithm data-structures time-complexity