2013-01-07 70 views
2

我已經整理陣列二進制搜索,計數複製

{1,2,3,5,5,5,7,8,8} 

我想指望有多少倍,我發送的數量僅在longn在數組中。

例如:

public static int count(int[] array,5) 

將回復3

public static int count(int[] array,8) 

將回復2

所以我的計劃是:

1)做一個二進制搜索找到號碼

2)二進制搜索頂部邊界索引和底部邊界索引。 3)打印(頂部索引 - 底部索引)將給我在數組中的目標編號的時間。

我的代碼是否是logn? 請幫忙! :)

public class binarySearch 
{ 
    public static void main(String[]args) 
    { 
     System.out.println("d"); 
     int[]data={1,1,2,3,1,1,1}; 
     System.out.println(count(data,1)); 
    } 

    public static int count(int[] a, int x) 
    { 
     int low=0; 
     int high = a.length-1; 
     int count=0; 

     while(low <=high) 
     { 
      int mid=((low+high)/2);   
      if(x>a[mid]) 
       low=mid+1; 
      if(x<a[mid]) 
       high=mid-1; 

      if(x==a[mid])    
      { 
       int top=findTopIndex(a,x,mid);     
       int bottom=findBottomIndex(a,x,mid); 
       return (top-bottom); 

      } 

     }  
     return 111111111; 

    } 

    public static int findTopIndex(int[] a, int x, int index) 
    { 
     int low=index; 
     int high = a.length-1;  
     int mid; 
     if(x==a[high]) 
     return high; 

     while(low <= high) 
     {    
      mid=((low+high)/2);   
      if(x<a[mid]&&x==a[mid-1]) 
      return mid-1; 
      else if(x==a[mid]) 
       low=mid+1; 
      else if(a[mid]>x && a[mid-1]!=x) 
      high=mid-1; 


     } 
     return 11111111; 

    } 
    public static int findBottomIndex(int[] a, int x, int index) 
    { 
     int low=0; 
     int high = index-1;  
     int mid; 
     if(x==a[low]) 
     return low-1; 

     while(low <= high) 
     {    
     mid=((low+high)/2);   
      if(x>a[mid]&&x==a[mid+1]) 
      return mid; 
      else if(x==a[mid]) 
       high=mid-1; 
      else if(a[mid]<x && a[mid+1]!=x) 
      low=mid+1; 

     } 
     return 111; 

    } 

} 
+0

您是否需要*通過二分查找搜索邊界索引?看起來如果你繼續進行線性搜索,速度會很快。 – millimoose

+0

使用else if而不是if if –

+2

@millimoose對於{1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 ,5,5,5,5,5,5,5,5,8}'? –

回答

2

您寫的內容非常接近您需要的解決方案。你首先做一個二進制搜索,找到你正在搜索的數字的單個實例(假設它在位置index上找到),然後再進行兩個二進制搜索 - 一個搜索序列0, index,另一個尋找index, size兩個序列中的數字都是找到的數字。

所以我建議你只要通過索引findTopIndexfindBottomIndex並利用它。我可以寫出整個解決方案,但你自己來解決它會更好。

+0

這是一個很好的方法,我完全錯過了我的(刪除)答案的O(logn)部分。包含相同元素的列表導致O(n)。 – Gamb

+0

如果有相同數字的長期運行,那麼「兩個以上」的搜索是否也會落在所述運行的相應兩半中間的某處?似乎您想要遞歸搜索以查找頂部和底部索引 - 即當您無法再查找當前索引左側的數字時,當前索引就是運行的開始。 (反之亦然)。 – millimoose

+0

@millimoose否,這兩個附加的二進制搜索以不同的方式執行,以找到與x不同的第一個位置。我用於這些搜索的單調屬性「等於x」,並且通過執行單個二分搜索,可以找到單個索引,其中該屬性從0變爲1。 –