确定值是否在排序数组中的时间是多少?

时间:2009-01-22 20:04:58

标签: arrays complexity-theory big-o binary-search

我有一个5000个整数的排序数组。如果随机整数是数组的成员,我能判断多快?一般来说,C和Ruby会很好。

数组值的格式为

c * c + 1

其中c可以是1到5000之间的任何整数。

例如:

[2, 5, 10, 17, 26, 37, 50 ...]

9 个答案:

答案 0 :(得分:15)

log(n)用于c

上的二进制搜索

答案 1 :(得分:10)

我会说它是O(常数)! :)

给定一个随机数r,检查它是否是一个可以用形式(n * n + 1)表示的数字是微不足道的。只需检查sqrt(r-1)是否为整数!

(好吧,它可能比这复杂一点,因为你的编程语言可能会引入一些处理整数与浮点数的复杂性,但仍然:你根本不需要搜索数组:只需检查是否数字是这种特殊形式。)

答案 2 :(得分:6)

其他人提到的二进制搜索是O(log2N),可以递归编码:

   BinarySearch(A[0..N-1], value, low, high) {
       if (high < low)
           return -1 // not found
       mid = (low + high) / 2
       if (A[mid] > value)
           return BinarySearch(A, value, low, mid-1)
       else if (A[mid] < value)
           return BinarySearch(A, value, mid+1, high)
       else
           return mid // found
   }

或迭代地:

   BinarySearch(A[0..N-1], value) {
       low = 0
       high = N - 1
       while (low <= high) {
           mid = (low + high) / 2
           if (A[mid] > value)
               high = mid - 1
           else if (A[mid] < value)
               low = mid + 1
           else
               return mid // found
       }
       return -1 // not found
   }

但是,如果您正在寻找最快的方式,则可以根据您的号码的sqrt(N-1)设置查找表。只需5000字的内存就可以通过这种方式实现O(1)查找。

说明:

由于对于从1到N的整数N,所有数字的形式均为N ^ 2 + 1,因此您可以创建一个包含N个元素的表。位置i处的元素将指定i ^ 2 + 1是否在您的数组中。该表可以用长度为N的简单数组实现。构建O(N),空间N个字。但是一旦你有了表,所有的查找都是O(1)。

示例:

这是Python中的示例代码,它像往常一样读取伪代码: - )

import math

N = 5000
ar = [17, 26, 37, 50, 10001, 40001]

lookup_table = [0] * N

for val in ar:
    idx = int(math.sqrt(val - 1))
    lookup_table[idx] = 1

def val_exists(val):
    return lookup_table[int(math.sqrt(val - 1))] == 1

print val_exists(37)
print val_exists(65)
print val_exists(40001)
print val_exists(90001)

构建表最多占用O(N),查找为O(1)。

答案 3 :(得分:5)

从技术上讲,在固定大小的数组中查找元素的复杂性是不变的,因为log 2 5000不会改变。

答案 4 :(得分:2)

二进制搜索是O(log n)

WikiPedia

答案 5 :(得分:1)

O(log n)如果数组有n个元素

答案 6 :(得分:1)

只是为了扩展:它是 lg n 测试,即 log 2 n。这使它 O( log n)。为什么?因为二进制搜索的每次试验将数组分成两半;因此需要 lg n次试验。

答案 7 :(得分:0)

使用二进制搜索,它是Log(N)搜索时间。

bool ContainsBinarySearch(int[] array, int value) {
  return Array.BinarySearch(arrray, value) >= 0;
}

答案 8 :(得分:0)

在Perl中:

我会将值加载到静态哈希中,然后它将是O(1)。

构建查找哈希

lookup_hash {$ _} = 1 foreach(@original_array);

查找语法

($ lookup_hash {$ lookup_value})&amp;&amp; print“在O(1)中找到它 - 这里没有循环\ n”;