2013-01-07 71 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。 –