질문: 정렬된 배열의 경우 주어진 값이 배열에 존재하는지 확인하는 방법입니다.
아이디어: 존재 여부를 확인하려면 가장 간단한 방법은 배열을 직접 반복하여 각 값을 비교하는 것입니다. 그러나 정렬된 배열의 경우 이와 같이 작성하면 "정렬된" 기능을 활용하는 데 완전히 실패합니다.
모두 "이진 검색"을 사용합니다.
//有序数组为 $arr = array(2,5,66,87,954,1452,5865); //查找值 $str = 1452; //我们先定义 三个参数 $front = 0;//一个开始值下标 $end = count($arr) - 1;//一个结束值下标 $mid = intval(($front + $end) / 2);//中间值下标
1. 첫 번째 비교에서는 검색 값 str이 중간 값 mid와 같은지 직접 확인하고 같으면 직접 true를 반환합니다. 2. 검색 값 str이 중간 값보다 큰 경우 mid 값은 검색 값 str이 중간 값의 오른쪽에 있을 수 있음을 의미합니다. 즉, 시작 값 front를 다시 할당해야 합니다 = 중간 값 mid + 1, 끝 값 end는 변경할 필요가 없으며, 중간 값 mid는 새로운 시작 값 + 끝 값이 차례로 됩니다.
3. 검색 값 str이 중간 값 mid보다 작으면 검색이 수행됨을 의미합니다. str 값은 중간 값의 왼쪽에 있을 수 있습니다. 즉, 시작 값을 변경할 필요가 없으며 끝 값 end를 다시 할당해야 합니다 = 중간 값 - 1, 중간 값 mid는 시작 값 + 새로운 종료값
----위와 같이 들어오는 시작값, 종료값, 중간값을 비교합니다. 시작 값이 종료 값보다 크면 찾을 수 없다는 의미이고, 그렇지 않으면 찾았다고 반환합니다.
구체적인 코드는 다음과 같습니다:
$str = 89;//查找值 $arr = [1,55,66,89,420];//有序数组 $ren = find($arr, $str); echo '<pre class="brush:php;toolbar:false">'; var_dump($ren); function find($arr, $str){ $front = 0;//开始下标 $end = count($arr) - 1;//结束下标 while($front <= $end){//结束值 大于 开始值 ,反之则退出 $mid = intval(($front + $end) / 2);//中间值下标 if($str == $arr[$mid]){ return $mid;//存在直接返回值的下标 } if($str > $arr[$mid]){ $front = $mid + 1;//在前面 } if($str < $arr[$mid]){ $end = $mid - 1;//在后面 } } return false; }
반환 결과: 89는 네 번째 요소 값 첨자 3
추천 비디오 튜토리얼: "
php tutorial위 내용은 PHP는 정렬된 배열에 특정 값이 포함되어 있는지 찾습니다(이진 검색).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!