간단한 인터뷰 질문 : 프로그래머의 많은 90 %가이 알고리즘을 쓸 수 없습니다 완전히 올바른 것입니다. . .

몇 시간 전, 내가 보는 포럼에서 통계는 프로그래머의 90 %가 단순한 이분법에 쓸 수 있다고. 이분법은 매우 쉽게 옳지 않아? 그 감각 아닌가?

사실, 이분법은 정말 이분법 특히 다양한 변종, 그리 간단하다. 가장 단순한 이분법은, 모양의 정렬 된 배열에서 키 값입니다. 다음 절차.


/**
 * 二分查找,找到该值在数组中的下标,否则为-1
 */
static int binarySerach(int[] array, int key) { int left = 0; int right = array.length - 1; // 这里必须是 <= while (left <= right) { int mid = (left + right) / 2; if (array[mid] == key) { return mid; } else if (array[mid] < key) { left = mid + 1; } else { right = mid - 1; } } return -1; } 

이 프로그램은 내가 한 자격을 갖춘 프로그래머로 쓸 수 있어야한다고 생각합니다. 각 포인터가 움직이는 좌우 그 작은 노트, 필요한 경우 무한 루프를 방지하기 위해 중간 +1 또는 -1의 기초, 프로그램이 제대로 실행 할 수 있습니다.

조건이 조금 변경하는 경우, 당신은 그것을 쓸 것이다? 예를 들어, 데이터는 어레이에서 반복 될 수 있고, 데이터의 최소 (또는 최대) 인덱스 매칭 반환해야 상기 어레이의 첫 번째 요소는 키보다 큰 찾을 가까이 필요로 한 단계 (키는 최소값보다 큰 ) 등의 표준 요소 미만. 이들은하지만, 경우에만 약간의 변화, 그들은 정말 더 신중하게 달성하고 싶다. 아래에 나열된 다음 이진 검색의 변형을 달성한다.

1 제와 동일의 키 요소를 찾아


// 查找第一个相等的元素
static int findFirstEqual(int[] array, int key) { int left = 0; int right = array.length - 1; // 这里必须是 <= while (left <= right) { int mid = (left + right) / 2; if (array[mid] >= key) { right = mid - 1; } else { left = mid + 1; } } if (left < array.length && array[left] == key) { return left; } return -1; } 

(2) 동일의 핵심 요소의 마지막을 찾을 수

// 查找最后一个相等的元素
static int findLastEqual(int[] array, int key) { int left = 0; int right = array.length - 1; // 这里必须是 <= while (left <= right) { int mid = (left + right) / 2; if (array[mid] <= key) { left = mid + 1; } else { right = mid - 1; } } if (right >= 0 && array[right] == key) { return right; } return -1; } 

도 3은 첫 번째 요소가 키 이상인 발견

// 查找第一个等于或者大于key的元素
static int findFirstEqualLarger(int[] array, int key) { int left = 0; int right = array.length - 1; // 这里必须是 <= while (left <= right) { int mid = (left + right) / 2; if (array[mid] >= key) { right = mid - 1; } else { left = mid + 1; } } return left; } 

4. 키가 아닌 첫 번째 요소 더 찾기

// 查找第一个大于key的元素
static int findFirstLarger(int[] array, int key) { int left = 0; int right = array.length - 1; // 这里必须是 <= while (left <= right) { int mid = (left + right) / 2; if (array[mid] > key) { right = mid - 1; } else { left = mid + 1; } } return left; } 

5, 마지막 핵심 요소를 찾을 수는 같거나보다 작은

// 查找最后一个等于或者小于key的元素
static int findLastEqualSmaller(int[] array, int key) { int left = 0; int right = array.length - 1; // 这里必须是 <= while (left <= right) { int mid = (left + right) / 2; if (array[mid] > key) { right = mid - 1; } else { left = mid + 1; } } return right; } 

6, 마지막 요소가 키보다 작 찾을 수

// 查找最后一个小于key的元素
static int findLastSmaller(int[] array, int key) { int left = 0; int right = array.length - 1; // 这里必须是 <= while (left <= right) { int mid = (left + right) / 2; if (array[mid] >= key) { right = mid - 1; } else { left = mid + 1; } } return right; } 

다음으로, 우리는 적절한 검사 알고리즘의 네 가지 변형 할 수 있습니다.

많은 시간이, 로컬 응용 프로그램 이진 검색이 직접 발견하고 평등 한 핵심 요소지만, 위에서 언급 한 이진 검색의 다양한 변종을 사용하지, 이러한 변형을 마스터하면 다시 검색 이진 검색을 사용할 때 그것은 더욱 편리하게 느낄 것이다.

독자 복지

위의 문서에 나는 얼굴 면접 질문 및 답변의 대부분에 관여하는 인터넷 회사 자바 프로그래머를 표현하는 경우, 모든 사람이 두보, 레디 스, 인 Netty, 사육사, 봄 구름을 포함하여 (비디오 자료를 공유 할 문서 아키텍처와 자유를했다 당신의 사전 인터뷰를 검토하는 데 도움과 좋은 직장을 찾으려) 높은 동시성 아키텍처 기술 정보, 분산뿐만 아니라 당신에게 정보를 온라인 학습을 검색하는 시간을 절약 할 수 있습니다.

입수 쿤 그룹을 추가 : 956 011 797 를 클릭하십시오 지금 가입하는 것은  여동생을 관리 할 수있는 무료 액세스를 찾을 수 있습니다!

合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

 

 

추천

출처www.cnblogs.com/Longdingtian/p/10985288.html