【问题标题】:Searching from a sorted array in less than O(log(n)) running time在少于 O(log(n)) 的运行时间内从排序数组中搜索
【发布时间】:2012-05-08 03:39:27
【问题描述】:

我正在使用二进制搜索在 O(log(n)) 时间内从排序的数字数组中搜索一个数字。我的搜索 C 函数如下:

search(int array[],int size,int search)
 {
 int first=0;
 int last=size-1;
 int middle = (first+last)/2;
   while( first <= last )
   {
      if ( array[middle] < search )
         first = middle + 1;    
      else if ( array[middle] == search ) 
      {
         printf("%d found at location %d.\n", search, middle+1);
         break;
      }
      else
         last = middle - 1;

      middle = (first + last)/2;
   }
   if ( first > last )
      printf("Not found! %d is not present in the list.\n", search);
}

这里size 是数组的大小,search 是要搜索的数字。 有没有办法以比上述程序更复杂的方式执行搜索?

【问题讨论】:

  • (1) there must be a way - 为什么? (2) 如果您的阵列在 RAM 中,在 32 位系统中,log_2(n) &lt; 32。有那么糟糕吗? (3) 您是在寻找更好的渐近复杂度 [Omega(logn)] 还是具有更好常量的实现?
  • 标准 C 定义 bsearch() 在 O(log(n)) 时间内搜索数组。我相信您无法通过基于比较的搜索做得更好。
  • 所有基于比较的算法都有一个logn的下限。 @pmg 已经制作了证据来支持您的信念。
  • this question 的可能重复项。

标签: c algorithm search binary-search


【解决方案1】:

是的,使用哈希表。一般情况下应该会更快。

【讨论】:

  • 这意味着它不再是一个排序数组了。
  • @UmNyobe:你可以同时存储一个排序数组一个hashmap:key-&gt;index。如果我错过了什么,请纠正我,但我认为它不会使其他排序数组操作也渐近变慢。我认为这不是一个好的解决方案,但有可能。
  • @amit 是的。 OP应该更多地澄清他的需求。虽然我不是反对者
猜你喜欢
  • 2019-08-19
  • 2012-04-16
  • 2015-12-19
  • 2019-02-01
  • 2016-02-12
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多