찾다
php教程php手册浅谈PHP第三弹---使用二分查找法查找数组中的元素位置

浅谈PHP第三弹---使用二分查找法查找数组中的元素位置

Jun 13, 2016 am 10:48 AM
arrayphp위치사용요소존재하다우리를정렬찾다

在php中我们可以通过array_search()函数来查找一个数组内的元素值的键名.

同样,我们可以通过使用二分法来查找数组内的元素的键名.
那什么是二分法呢?

我来解释下:
如果数据是按升序排序的,我们从数据的中间位置开始查找,若给定的值恰好等于当前位置的值,查找成功,若给定的值小于当前位置的值,那我们就从以当前值为准查找其前半部分的值,反之,若给定的值大于当前值,那么就从以当前值为准查找其后半部分的值.

也就是说,利用二分法查找的数据,必须是排好序的.
下面我们尝试查找数组array(1,2,3,4,5,6,7,8,9,10)中的某一个值的位置:
function Search($a,$val){
$low = 0;
$high= count($a) - 1;
while($low $mid = intval(($low+$high)/2);
if($a[$mid] == $val)
return $mid;
if($a[$mid] > $val){
$high = $mid - 1;
}else{
$low = $mid + 1;
}
}
return -1;
}
?>
以上函数,第一个参数为传入的数组,第二个参数为该数组需要查询的值.
我们给数组的键设置一个最小值$low为0,设置一个最大值为$high为数组长度减一,那么中间值我们就可以设置为intval(($low+$height)/2),
也就是说,当数组元素长度为奇数时,数组的中间值正好在正中间,
例如数组长度为5,那中间值正好为2,也就是(0+4)/2,
0,1,2,3,4
那当我们的数组长度为偶数时,利用上述公式是无法除尽的,所以我们要取整,无论是进一法取整还是舍去法取整都是可以的
例如数组长度为6,那中间值为(0+5)/2,值为2.5,那数组中键为2.5的是不存在的,所以我们就需要取整为2
0,1,2,3,4,5
如果使用上述取整函数intval或者是floor函数获得的键为2,如果使用ceil取整,这里得到的键即为3

那么,我们拿上面的数组来说:
数组的长度为10,那么中间值即为intval((0+(10-1))/2),为4,索引为4的也就是数组中的第五个元素"5"
1,2,3,4,5,6,7,8,9,10

好,我们下面开始判断,
1.如果需要查询的值恰好为"5",查找成功,直接返回该值的索引即可.
也就是
if($a[$mid] == $val)
return $mid;
2.如果要查询的值小于"5",我们需要把$high的值设为中间值减一,即为4-1,并返回继续查询中间值的前半部分(红色部分)
1,2,3,4,5,6,7,8,9,10
即为:
if($a[$mid] > $val){
$high = $mid - 1;
}

3.如果要查询的值大于"5",我们就需要把$low的值设为中间值加一,即为4+1,并返回继续查询中间值的后半部分(红色部分)
1,2,3,4,5,6,7,8,9,10
即为:
else{
$low = $mid + 1;
}
设置完之后,返回继续查询,如果满足条件$low while($low .......
}
return -1;
此函数的缺点在于:
如果数组中有重复的值,只能查到其中的一个值的键,有兴趣的童鞋,可以对以上函数进行完善,跟帖回复.

 

摘自 zdrjlamp
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.