二分查找php
❶ 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;
//--------------------
//