2017-10-24 4 views
0

그들의 목적은 키와 배열 항목 사이의 비교 수를 반환하는 것입니다. Java를 처음 사용하고 모범 사례를 완전히 이해하지 못하여 변경해야 할 것이 있으면 알려주십시오.Java 2 진 및 선형 검색 알고리즘이 올바르게 작동합니까?

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; 
} 
+0

두 입력을 모두 정렬합니까? 바이너리 검색은 정렬 된 데이터에서만 작동하며 정렬 된 데이터에서 작동하는 경우 선형 검색이 빨라질 수 있습니다 (array [i]> 키를 반환 할 때). – phflack

+0

예, 둘 모두에 대한 입력이 정렬됩니다. –

답변

0

코드가 정확합니다. 즉, 선형 비교와 이진 검색 모두에 대해 얼마나 많은 비교가 수행 될지 계산됩니다. 당신이 초보자 인 것처럼 코드를 작성할 때 몇 가지 더 좋은 습관을 추천합니다.

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; 

    } 

} 

나는 약간의 공간, 그것은 취향의 문제 등등, 더 나은 이름으로 몇 가지 변수 이름을 변경 추가,하지만 당신은 항상 코드의 가독성에주의를 지불해야합니다.

+0

개인 취향/회사 정책에 따라이 규정이 적용되지만 개인적으로는 휴식 및 복수 신고가 싫어합니다. 이안 조이너 (Ian Joyner)가 작성한이 기사 [ '단일 입력, 단일 이탈 (SESE) 휴리스틱] (http://ianjoyner.name/No_return.html)은 내 생각을 요약 한 것입니다. –

+0

@ d.j.brown'개인 취향/회사 정책에 따라 달라집니다 'ype – davidbuzatto

+0

@ d.j.brown 휴식 시간을 어떻게 변경 하시겠습니까? –