2012-04-27 33 views
-1

我使用二分搜索從O(log(n))時間的排序數組數組中搜索數字。對於搜索我的C函數如下:從小於O(log(n))運行時間的排序數組中搜索

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

(1)'一定有辦法' - 爲什麼? (2)如果你的數組在RAM中,在32位系統中,log_2(n)<32'。這不好嗎? (3)你在尋找更好的漸近複雜度['Omega(logn)']還是更好的常量實現? – amit 2012-04-27 11:32:30

+0

標準C定義了['bsearch()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/bsearch.html),它在O(log(n))時間內搜索數組。我相信在基於比較的搜索中你不能做得更好。 – pmg 2012-04-27 11:33:58

+0

所有基於比較的算法都有logn的下限。 @pmg證明已經被用來支持你的信念。 – UmNyobe 2012-04-27 11:36:27

回答

-1

是的,使用散列表。平均情況下應該更快。

+3

這意味着它不再是已排序的數組。 – UmNyobe 2012-04-27 11:38:49

+1

@UmNyobe:你可以同時存儲有序數組**和**'hashmap:key-> index'。糾正我,如果我錯過了什麼,但我不認爲這會使其他排序的數組操作漸漸慢下來。我不認爲這是一個好的解決方案,但它是可能的。 – amit 2012-04-27 11:47:52

+0

@amit是的。 OP應該澄清更多他需要的東西。儘管我不是downvoter – UmNyobe 2012-04-27 11:54:19

相關問題