在有序列表中搜索

时间:2015-04-29 11:34:05

标签: algorithm sorting data-structures

假设我们有一个按升序排序的列表0,10,30,45,60,70。给定一个数字X如何在列表下面的列表中找到它?

我正在寻找最有效的(更快的)算法来做到这一点,当然不必迭代整个列表。

Ex: [0, 10, 30, 45, 60, 70]

Given the number 34, I want to return 30.
Given the number 30, I want to return 30.
Given the number 29, I want to return 10.

等等。

3 个答案:

答案 0 :(得分:5)

  • 如果您的列表确实是那么小,最有效的方式 创建一个大小为71的数组,用layout -> add a gadget -> html/javascript初始化一次,并在不断的查询时间内 - 得到答案。这个想法是因为您可能的查询集非常有限,没有理由不预先计算它并从预先计算的数据中获得结果。

  • 如果你不能预处理,那么阵列就是那么小 - 线性扫描 对于如此小的阵列,使用的开销将是最有效的 对于这样的小型数组,复杂的算法并不值得。任何 添加a的更复杂算法(如二进制搜索)的开销 每次迭代的大量指令对于小数组是无效的。 请注意arr[i] = answer,这也是预期的时间 (假设均匀分布)将结果用于线性搜索, 但是线性搜索要简单得多,每次迭代都要快得多 而不是二元搜索。

伪代码:

log_2(6) < 3
  • 如果阵列越来越大,请使用binary search。这个 算法旨在找到一个值(或最接近的第一个值) 它)在一个排序的数组中,并在prev = -infinity for (x in arr): if x>arr: return prev prev = x 时间运行,需要 遍历的元素明显少于整个列表。
    与天真线性扫描相比,假设统一分布查询,它将获得更好的结果(在时间性能方面)。

答案 1 :(得分:1)

列表总是排序吗?快速写入或快速执行时间?

看看这个:http://epaperpress.com/sortsearch/download/sortsearch.pdf

答案 2 :(得分:0)

实现Binary Search Algorithm,如果找不到元素,则返回上次访问位置的元素(如果它小于或等于给定数字)或上次访问位置中的元素 - 1(如果最后一个访问位置的元素大于给定数字)。