【问题标题】:Are my Java Binary and Linear Search Algorithms working correctly?我的 Java 二进制和线性搜索算法是否正常工作?
【发布时间】:2017-10-24 17:08:41
【问题描述】:

它们的目的是返回键和数组项之间的比较次数。 请让我知道是否有任何需要更改的地方,因为我是 Java 新手,还不完全熟悉最佳实践。

public class BinaryVsLinear {

private static int linearSearch(int key, int[] array){
  int count = 0;
  for (int i = 0; i < array.length; i++){
      count++;
      if (array[i] == key){
          i += array.length +1;
      }  
  }
  return count;
}

private static int binarySearch(int key, int[] array){

  int count = 0, l = 0, r = array.length -1;
  while (l <= r){
        int m = (l+r)/2;
        count++;
        if (array[m] == key){
            return count;
        }
        count++;
        if (array[m] < key){
            l = m + 1;

        }
        else{
            r = m - 1;
        }
    }
    return count;
}

【问题讨论】:

  • 两者的输入是否已排序?您的二分搜索仅适用于已排序的数据,如果它正在处理已排序的数据,则可以加快线性搜索(尝试在 array[i]>key 时返回)
  • 是的,两者的输入都已排序。

标签: java binary-search linear-search


【解决方案1】:

您的代码是正确的,即它计算了线性搜索和二进制搜索将执行的比较次数。由于您是新手,在编写代码时我会推荐一些更好的做法,看看吧。

public class BinaryVsLinear {

    private static int linearSearch( int key, int[] array ) {

        int count = 0;

        for ( int i = 0; i < array.length; i++ ){
            count++;
            if ( key == array[i] ){
                break;
            }  
        }

        return count;

    }

    private static int binarySearch( int key, int[] array ) {

        // one variable per line
        // use better names
        int count = 0;
        int left = 0;
        int right = array.length -1;

        while ( left <= right ){

            int middle = ( left + right ) / 2;

            count++;
            if ( array[middle] == key ){
                return count;
            }

            count++;
            if ( key > array[middle] ){
                left = middle + 1;
            } else{
                right = middle - 1;
            }

        }

        return count;

    }

}

我添加了一些空格,将一些变量名称更改为更好的名称等。这是一个偏好问题,但您必须始终注意代码的可读性。

【讨论】:

  • 个人喜好/公司政策将决定这一点,但我个人非常不喜欢休息和多次退货。 Ian Joyner 的这篇文章“Single-entry, single-exit (SESE) heuristic”总结了我对此的看法。
  • @d.j.brown Personal preference / company policy will dictate this 是的
  • @d.j.brown 您建议如何更改休息时间?
  • 我喜欢更好的变量名称,但我看不出这甚至如何解决正确工作的问题。请更新以包含有关正确性的内容。
  • @EdwinBuck 他的代码对于它的目标是正确的。我只是修改他的代码以显示更好的做法,因为他说他是new to Java and I am not yet fully familiar with best practices
猜你喜欢
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多