二进制搜索1/4修改

时间:2014-09-21 02:11:53

标签: java algorithm binary-search

我的任务是编写1/4 - 3/4二进制搜索算法修改,其中第一个元素在搜索列表中的项目时进行比较,是' pivot'元素距离的1/4 列表的一端(假设选择的结尾是剩下的' 列表)。如果没有匹配(' pivot'元素不等于搜索键)和 如果列表中应进一步检查以进行搜索的部分是1/4 列表的一部分,继续采用相同的策略。每当部分 应进一步检查搜索的列表大小为3/4,切换到 二次搜索一次并返回1 / 4th-3/4策略。 我的代码在这里,但它不起作用,即使我做得对,我也不知道:

public static int ThreeFour(int[] Array,int item)
    {
       int counter =0;
       int high=Array.length-1;
       int low=0;
       int pivot = 0;

       boolean split = true;
       boolean last =true;

       while(high >= low) {
      if(split){
           pivot = (high+low)/4;
           last=true;}
       else
      {  pivot = (high+low)/2;
         split=true;
         last=false;
      }   

         if(Array[pivot] == item) 
         {  counter++;
         System.out.println("Pivot"+pivot);
         return counter;
         }

         if(Array[pivot] < item) {
          low = pivot + 1;
          counter++; 
         }

         if(Array[pivot] > item) {
          high = pivot - 1;
          counter++;
          if (last)
              split=false;
         }
       }
         return 0;   
    }

它不起作用,也许有一个更简单的策略来做到这一点?最困难的部分是让它记住它已经分成两半:/

1 个答案:

答案 0 :(得分:1)

确定枢轴的公式对于3/4分割来说是错误的。如果您希望在low与[{1}}的某个时间点high之间区分c0 <= c <=1之间的间隔,则会得到:

pivot = low + c * (high - low)
      = (1 - c) * low + c * high

这将为low提供c == 0,为high提供c == 1以及为您的3/4分割提供

pivot = 0.75 * low + 0.25 * high

或者,使用整数运算:

pivot = (3 * low + high) / 4

特别是,lowhigh的因素应总计为1。

我还认为你的函数有一个逻辑错误:你返回递归深度,这对数组没有意义。您应该返回数据透视表,即找到该项目的数组索引。这也意味着你无法在失败时返回0,因为那是一个有效的数组索引。返回一个非法索引,如-1,表示该项目未找到。