二分查找
数组先排好序,然后从数组中间位置开始,如果中间元素等于查找元素,就停止查找,如果查找元素大于中间元素就在后半部分去继续查找,如果小于中间元素就到前半部分继续查找,直到找到为止。
代码实现:
function binarySearch($arr, $value) {
$left = 0;
$right = count($arr) - 1;
while($left <= $right){
if($value == $arr[$left]) { return $left; }
$mid = floor(($left + $right)/2); //向下取整
if($value == $arr[$mid]) { return $mid;}
if($value > $arr[$mid]) {
$left = $mid +1;
}else{
$right = $mid -1;
}
}
分块查找
也叫索引查找,需要建立一个索引表,先根据索引定位,然后再进行表查找。
哈希查找
也叫散列查找,先计算元素的存储地址,然后根据地址直接定位。
树表查找
B树(二叉树)
function PreOrderTraverse($node){ //前序遍历
print_r($node['data']); //输出值
PreOrderTraverse($node['lChild']); //左节点
PreOrderTraverse($node['rChild']); //右节点
}
function inOrderTraverse($node){ //中序遍历
inOrderTraverse($node['lChild']); //左节点
print_r($node['data']); //输出值
inOrderTraverse($node['rChild']); //右节点
}
function postOrderTraverse($node){ //后序遍历
postOrderTraverse($node['lChild']); //左节点
postOrderTraverse($node['rChild']); //右节点
print_r($node['data']); //输出值
}
B- 树
即多路搜索树,关键字集合分布在整颗树中,B-树的搜索,从根结点开始,对关键字序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点。
B+ 树
B-树的变体,也是一种多路搜索树,所有关键字都在叶子结点出现,B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中,非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储关键字的数据层,更适合文件索引系统。
B* 树
是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针,将结点的最低利用率从1/2提高到2/3。