当前位置:首页 » 编程语言 » 二分查找php

二分查找php

发布时间: 2023-02-02 22:55:33

php 二分查找,为什么查无此数

方法binarysearch最后一个参数名写错了!

$rightindex 写成 $rightndex

❷ php二分查找递归和非递归的区别

binarySearch

二分查找采用的方法比较容易理解,以数组为例,

先取数组中间的值floor((low+top)/2),
然后通过与所需查找的数字进行比较,若比中间值大,则将首值替换为中间位置下一个位置,继续第一步的操作;若比中间值小,则将尾值替换为中间位置上一个位置,继续第一步操作
重复第二步操作直至找出目标数字
比如从1,3,9,23,54 中查找数字23,
首位置为0, 尾位置为4,中间位置就为2 值为9,比23小,则首位置更新为2+1即3;那么接下来中间位置就为(3+4)/2=3,值为23,比较相等即找到
// 非递归
// $target是要查找的目标 $arr是已经排序好的数组
function binary(&$arr,$low,$top,$target){
while($low <= $top){
//由于php取商是有小数的,所以向下取整,不过也可不加,数组也会取整
$mid = floor(($low+$top)/2);
echo $mid."<br>";
if($arr[$mid]==$target){
return $arr[$mid];
}elseif($arr[$mid]<$target){
$low = $mid+1;
}else{
$top = $mid-1;
}
}
return -1;
}
// 递归
function binaryRecursive(&$arr,$low,$top,$target){
if($low<=$top){
$mid = floor(($low+$top)/2);
if($mid==$target){
return $arr[$mid];
}elseif($arr[$mid]<$target){
return binaryRecursive($arr,$mid+1,$top,$target);
}else{
return binaryRecursive($arr,$low,$top-1,$target);
}
}else{
return -1;
}
}

❸ 高分求一段IP判断城市的PHP代码

<?php
/**************************/

/******IP判断城市文件******/

/**************************/

$action=$_GET['action'];
if($action==ip){
if ($_SERVER["HTTP_X_FORWARDED_FOR"]){
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];}
else if ($_SERVER["HTTP_CLIENT_IP"]){
$ip = $_SERVER["HTTP_CLIENT_IP"];}
else if ($_SERVER["REMOTE_ADDR"]){
$ip = $_SERVER["REMOTE_ADDR"];}
else if (getenv("HTTP_X_FORWARDED_FOR")){
$ip = getenv("HTTP_X_FORWARDED_FOR");}
else if (getenv("HTTP_CLIENT_IP")){
$ip = getenv("HTTP_CLIENT_IP");}
else if (getenv("REMOTE_ADDR")){
$ip = getenv("REMOTE_ADDR");}
else{
$ip = "Unknown";}
}

$dat_path = 'qqwry.dat';
//判断IP地址是否有效
if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $ip)){
return 'IP Address Invalid';
}
//打开IP数据库
if(!$fd = @fopen($dat_path, 'rb')){
return 'IP data file not exists or access denied';
}
//explode函数分解IP地址,运算得出整数形结果
$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
//获取IP地址索引开始和结束位置
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$ipbegin = implode('', unpack('L', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
$BeginNum = 0;
$EndNum = $ipAllNum;
//使用二分查找法从索引记录中搜索匹配的IP地址记录
while($ip1num>$ipNum || $ip2num<$ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
//偏移指针到索引位置读取4个字节
fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return 'File Error';
}
//提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);
//提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
if($ip1num > $ipNum) {
$EndNum = $Middle;
continue;
}
//取完上一个索引后取下一个索引
$DataSeek = fread($fd, 3);
if(strlen($DataSeek) < 3) {
fclose($fd);
return 'File Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4);
if(strlen($ipData2) < 4) {
fclose($fd);
return 'File Error';
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32);
//找不到IP地址对应城市
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
fclose($fd);
return 'No Data';
}
$BeginNum = $Middle;
}
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3);
if(strlen($ipSeek) < 3) {
fclose($fd);
return 'System Error';
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
fseek($fd, $ipSeek);
$ipFlag = fread($fd, 1);
}
if($ipFlag == chr(2)) {
$AddrSeek = fread($fd, 3);
if(strlen($AddrSeek) < 3) {
fclose($fd);
return 'System Error';
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($fd, $AddrSeek);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0)){
$ipAddr2 .= $char;
}
}
fclose($fd);
//返回IP地址对应的城市结果
if(preg_match('/http/i', $ipAddr2)) {
$ipAddr2 = '';
}
$ipaddr = "$ipAddr1 $ipAddr2";
$ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
$ipaddr = preg_replace('/^s*/is', '', $ipaddr);
$ipaddr = preg_replace('/s*$/is', '', $ipaddr);
if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
$ipaddr = 'No Data';
}

require_once("cityadd.php");

if(strpos($ipaddr,$hefei))
{

}

echo "var jstext='$hefei'"; //输出一句JS语句,生成一个JS变量,并赋颠值为PHP变量 $action的值

?>
一下是cityadd.php的内容

<?php
$hefei = "合肥市";
$wuhu = "芜湖市";
$huainan = "淮南市";
$maanshan = "马鞍山市";
$chuzhou = "滁州市";
$huaibei = "淮北市";
$tongling = "铜陵市";
$anqing = "安庆市";
$huangshan = "黄山市";
$fuyang = "阜阳市";
$bengbu = "蚌端口市";
$suzhou = "宿州市";
$luan = "六安市";
$bozhou = "亳州市";
$chizhou = "池州市";
$xuancheng = "宣城市";
$qita = "其他";
?>
上网下一个qqwry.dat
这几个文件放在一个文件夹,做一个页面里面放一个JS,并且调用第一个文件的函数,就可以了
<script >document.write(jstext)</script>

❹ PHP二分查找算法的实现方法示例

本文实例讲述了PHP二分查找算法的实现方法。分享给大家供大家参考,具体如下:
二分查找法需要数组是一个有序的数组
假设我们的数组是一个递增的数组,首先我们需要找到数组的中间位置.
1.
要知道中间位置就需要知道起始位置和结束位置,然后取出中间位置的值来和我们的值做对比。
2.
如果中间值大于我们的给定值,说明我们的值在中间位置之前,此时需要再次二分,因为在中间之前,所以我们需要变的值是结束位置的值,此时结束位置的值应该是我们此时的中间位置。
3.
反之,如果中间值小于我们给定的值,那么说明给定值在中间位置之后,此时需要再次将后一部分的值进行二分,因为在中间值之后,所以我们需要改变的值是开始位置的值,此时开始位置的值应该是我们此时的中间位置,直到我们找到指定值。
4.
或者中间值等于最初的起始位置,或结束位置(此时说明给定值未找到),下面我们来用代码实现~
//循环实现
function
getValue($num,$arr)
{
//查找数组的中间位置
$length=count($arr);
$start=0;
$end=$length;
$middle=floor(($start+$end)/2);
//循环判断
while($start>$end-1)
{
if($arr[middle]==$num)
{
return
middle+1;
}
elseif($arr[middle]<$num)
{
//如果当前要查找的值比当前数组的中间值还要打,那么意味着该值在数组的后半段
//所以起始位置变成当前的middle的值,end位置不变。
$start=$middle;
$middle=floor(($start+$end)/2);
}
else{
//反之
$end=$middle;
$middle=floor(($start+$end)/2);
}
}
return
false;
}
//递归实现
/*
*
从数组中获取元素值
*
@param1
int
$num,要查找的目标值
*
@param2
array
$arr,要查找的数组
*
@param3
int
$start,查找的起始位置
*
@param4
int
$end,查找的结束位置
*
@return
mixed,找到了返回位置,没找到返回false
*/
function
getValue4($num,$arr,$start
=
0,$end
=
100){
//采用二分法查找
$middle
=
floor(($end
+
$start)
/
2);
//判断
if($arr[$middle]
==
$num){
//已经找到了,递归的出口
return
$middle
+
1;
}elseif($arr[$middle]
<
$num){
//要查找的元素在数组的后半段
$start
=
$middle
+
1;
//边界值
if($start
>=
$end){
//没有找到,但是已经超出边界值,递归出口
return
false;
}
//调用自己去查找:递归点
return
getValue4($num,$arr,$start,$end);
//getValue4($num,$arr,51,100)
}else{
//要查找的元素在数组的前半段
$end
=
$middle
-
1;
//判断边界值
if($end
<
0)return
false;
//调用自己:递归点
return
getValue4($num,$arr,$start,$end);
//getValue4($num,$arr,0,49)
}
//都没有找到
return
false;
}
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》及《php查找技巧与方法总结》
希望本文所述对大家PHP程序设计有所帮助。

❺ php 基础 学习

视频中不就有案例吗,跟着做做多了就知道自己该干什么了,多多关注it界的新闻,各种新闻不光php,像html5,安卓等等,只要多多看看,这些暂时你不需要学的,多了解就好。最简单的案例,像登录注册,新闻系统,采集等等,你都可以做啊。

❻ PHP如何实现折半查找算法

定义:折半查找技术,也就是二分查找。它的前提是线性表中的记录必须是关键码有序(通常从大到小有序),线性表必须采用顺序存储

折半查找的基本思想:取中间记录作为比较对象,若给定值与中间记录的关键字,则在中间记录的关键字相等,则查找成功;若给定值小于中间记录的作伴去继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

实现代码:
<?php //递归方式 function bin_recur_search($arr,$val){ global $time; if(count($arr) >= 1){ $mid = intval(count($arr) / 2); $time++; if($arr[$mid] == $val){ return '值为:'.$arr[$mid].'<br>查找次数:'.$time.'<br>'; }elseif($arr[$mid] > $val){ $arr = array_splice($arr,0,$mid); return bin_recur_search($arr, $val); }else{ $arr = array_slice($arr,$mid + 1); return bin_recur_search($arr, $val); } } return '未找到'.$val; } //非递归方式 function bin_search($arr,$val){ if(count($arr) >= 1){ $low = 0; $high = count($arr); $time = 0; while($low <= $high){ $time++; $mid = intval(($low + $high)/2); if($val == $arr[$mid]){ return '索引:'.$mid.'<br>值为:'.$arr[$mid].'<br>查找次数:'.$time; }elseif($val > $arr[$mid]){ $low = $mid + 1; }else{ $high = $mid - 1; } } } return '未找到'.$val; } $arr = array(1,3,5,7,7,9,25,68,98,145,673,8542); echo bin_recur_search($arr, 673); echo bin_search($arr, 673); ?>
运行结果:
值为:673 查找次数:4 索引:10 值为:673 查找次数:4
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》

❼ PHP面试官们你们面试实习生会提什么问题

那要看面试人的水平、拟聘任岗位的工作内容来定,如果有水平的面试老实,一般是问下面三个方面的内容之一:数据库、数据结构、算法。
数据库可以让你设计一个应用,口头描述一下如何设计这个数据库。数据结构一般是问链表、队列、堆栈相关的,算法很丰富,一般是问简单的二分查找等。
一般来说,
如果初学者,会问一些内置函数用法,或者函数变通使用。然后一些逻辑方面的题目。
如果2-3年,会问大数据量,高并发,数据库设计优化、sql性能最大化,以及服务器方面的一些优化。
如果3-5年,会考虑架构、服务器高可用性(负载均衡、主从同步等)、以及其他语言等

❽ 二分查找中出现相同元素怎么办php

二分法查找数组是否包含某一元素,兼容正反序,代码实现:
复制代码 代码如下:
<?php

$searchValue = (int)$_GET['key'];

function search(array $array, $value)
{
$max = count($array)-1;
$min = 0;
$isAscSort = $array[$min] < $array[$max];

while (TRUE) {
$sum = $min+$max;
$midKey = (int)($sum%2 == 1 ? ceil($sum/2) : $sum/2);

if ($max < $min) {
return -1;
} else if ($value == $array[$midKey]) {
return 1;
} else if ($value > $array[$midKey]) {
$isAscSort ? $min = $midKey+1 : $max = $midKey-1;
} else if ($value < $array[$midKey]) {
$isAscSort ? $max = $midKey-1 : $min = $midKey+1;
}
}
}

$array = array(
'4', '5', '7', '8', '9', '10', '11', '12'
);
// 正序
echo search($array, $searchValue);

// 逆序
rsort($array);
echo search($array, $searchValue);

这个之前搜过,看过网络的例子(Java的实现),还有一些其他技术宅写的Code,都有问题,根本就没实现,这些人不测试就放出来误导人,大家可以去搜搜看下,昨天闲来无事就自己写一个分享给大家。

❾ PHP核心语法:数组

在PHP中,数组的下标可以是整数或字符串,数组的元素顺序不是由下标决定,而是由其"加入"的顺序决定。

$v1 = 数组名[下标][下标][下标]

利用foreach获取最大值

每个数组,其内部都有一个"指针",该指针决定了该数组当前取值时候,取到的元素。foreach遍历都是依赖指针进行的。另外在foreach循环体中,键变量为值传递,而值变量为引用传递,即修改键变量不会影响数组下标,修改值变量,会修改数组中的值。同时在foreach循环体中对循环条件中的数组($arr31)进行操作时,其实是对$arr31复制了一份拷贝进行操作,循环结束后才将拷贝的那份数组替换原来的数组。

指针除了负责foreach循环的位置设定以外,还有其他函数也依赖于该指针:

利用for+reset+next获取最大值:

each解析:

由此可见each返回一个数组,并对数组的的键值做双份存储,一份以0,1作为下标,一份以value,key作为下标。

list解析:

依次取数组中下标为0,1,2,3,4,5···的元素值,并一次性放入多个变量中(一一对应)

利用上述两个函数在使用while进行数组遍历:

从一个数组中找到一个元素的数据,可以找下标也可以找数据值
数组的查找通常有2种需求:

从数组中按顺序查找一个元素。
需求1:判断要找的元素是否存在。

需求2:判断要找的元素得下标。

二分查找是针对一个已经进行了排序的数组(即数据已经有序)。

❿ PHP内置函数的数据结构

//二分查找(数组里查找某个元素)
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
//
顺序查找
(数组里查找某个元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
//
线性表的删除
(数组中实现)
function delete_array_element($array, $i)
{
$len = count($array);
for ($j=$i; $j<$len; $j++){
$array[$j] = $array[$j+1];
}
array_pop($array);
return $array;
}
//冒泡排序(数组排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j--){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
//
快速排序
(数组排序)
function quicksort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++){
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quicksort($left_arr);
$right_arr = quicksort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
//------------------------
// PHP内置字符串函数实现
//------------------------
//字符串长度
function strlen($str)
{
if ($str == '') return 0;
$count = 0;
while (1){
if ($str[$count] != NULL){
$count++;
continue;
}else{
break;
}
}
return $count;
}
//截取子串
function substr($str, $start, $length=NULL)
{
if ($str=='' || $start>strlen($str)) return;
if (($length!=NULL) && ($start>0) && ($length>strlen($str)-$start)) return;
if (($length!=NULL) && ($start<0) && ($length>strlen($str)+$start)) return;
if ($length == NULL) $length = (strlen($str) - $start);
if ($start < 0){
for ($i=(strlen($str)+$start); $i<(strlen($str)+$start+$length); $i++) {
$substr .= $str[$i];
}
}
if ($length > 0){
for ($i=$start; $i<($start+$length); $i++) {
$substr .= $str[$i];
}
}
if ($length < 0){
for ($i=$start; $i<(strlen($str)+$length); $i++) {
$substr .= $str[$i];
}
}
return $substr;
}
//字符串翻转
function strrev($str)
{
if ($str == '') return 0;
for ($i=(strlen($str)-1); $i>=0; $i--){
$rev_str .= $str[$i];
}
return $rev_str;
}
//字符串比较
function strcmp($s1, $s2)
{
if (strlen($s1) < strlen($s2)) return -1;
if (strlen($s1) > strlen($s2)) return 1;
for ($i=0; $i<strlen($s1); $i++){
if ($s1[$i] == $s2[$i]){
continue;
}else{
return false;
}
}
return 0;
}
//查找字符串
function strstr($str, $substr)
{
$m = strlen($str);
$n = strlen($substr);
if ($m < $n) return false;
for ($i=0; $i<=($m-$n+1); $i++){
$sub = substr($str, $i, $n);
if (strcmp($sub, $substr) == 0) return $i;
}
return false;
}
//字符串替换
function str_replace($substr, $newsubstr, $str)
{
$m = strlen($str);
$n = strlen($substr);
$x = strlen($newsubstr);
if (strchr($str, $substr) == false) return false;
for ($i=0; $i<=($m-$n+1); $i++){
$i = strchr($str, $substr);
$str = str_delete($str, $i, $n);
$str = str_insert($str, $i, $newstr);
}
return $str;
//--------------------
//

热点内容
服务器和家用电脑质量 发布:2024-11-01 22:28:29 浏览:488
sqlserver默认实例 发布:2024-11-01 22:23:42 浏览:959
sort排序java 发布:2024-11-01 22:23:26 浏览:47
解压后的apk无法安装 发布:2024-11-01 22:22:10 浏览:665
公司的pop服务器地址 发布:2024-11-01 22:22:07 浏览:119
朵唯m30手机配置是真的吗如何 发布:2024-11-01 22:16:56 浏览:680
梦幻西游怎么清理缓存 发布:2024-11-01 22:15:52 浏览:344
如何配置fcm 发布:2024-11-01 22:08:15 浏览:853
原装电脑配置哪个好 发布:2024-11-01 22:05:49 浏览:728
r910服务器能上什么cpu 发布:2024-11-01 22:04:54 浏览:531