新聞中心
php實(shí)現(xiàn)全組合算法
?php
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了沁縣免費(fèi)建站歡迎大家使用!
/**
* 在數(shù)組$a中任意m個元素組合
*
* @param array $a 候選的集合
* @param int $n 候選的集合大小
* @param int $m 組合元素大小
* @param array $b 儲存當(dāng)前組合中的元素,這里儲存的是元素鍵值
* @param int $M 相當(dāng)一個常量,一直保持不變
* @return */
function combine($a,$n,$m,$b,$M){
for($i=$n;$i=$m;$i--){
$b[$m-1]=$i-1;
if($m 1){
$combine[]=combine($a,$i-1,$m-1,$b,$M);
}else{
$onecombine='';
for($j=$M-1;$j=0;$j--){
$onecombine.=$a[$b[$j]];
}
$combine[]=$onecombine;
$onecombine='';
}
}
return $combine;
}
/**
* 遞歸輸出數(shù)組
*
* @param array $arr 待輸出的數(shù)組
* @return int 返回?cái)?shù)組元素個數(shù)*/
function recursionarray($arr){
$i=0;
foreach($arr as $value){
if(is_array($value)){
$i+=recursionarray($value);
}else{
echo $value."br/";
$i++;
}
}
return $i;
}
$a=array('A','B','C','D','E','F','G','H','I','J');
$b=array();
$combine=combine($a,10,5,$b,5);
$count=recursionarray($combine);
echo "總共有".$count."組合";
?
PHP實(shí)現(xiàn)常見的排序算法
注:為方便描述,下面的排序全為正序(從小到大排序)
假設(shè)有一個數(shù)組[a,b,c,d]
冒泡排序依次比較相鄰的兩個元素,如果前面的元素大于后面的元素,則兩元素交換位置;否則,位置不變。具體步驟:
1,比較a,b這兩個元素,如果ab,則交換位置,數(shù)組變?yōu)椋篬b,a,c,d]
2,比較a,c這兩個元素,如果ac,則位置不變,數(shù)組變?yōu)椋篬b,a,c,d]
3,比較c,d這兩個元素,如果cd,則交換位置,數(shù)組變?yōu)椋篬b,a,d,c]
完成第一輪比較后,可以發(fā)現(xiàn)最大的數(shù)c已經(jīng)排(冒)在最后面了,接著再進(jìn)行第二輪比較,但第二輪比較不必比較最后一個元素了,因?yàn)樽詈笠粋€元素已經(jīng)是最大的了。
第二輪比較結(jié)束后,第二大的數(shù)也會冒到倒數(shù)第二的位置。
依次類推,再進(jìn)行第三輪,,,
就這樣最大的數(shù)一直往后排(冒),最后完成排序。所以我們稱這種排序算法為冒泡排序。
選擇排序是一種直觀的算法,每一輪會選出列中最小的值,把最小值排到前面。具體步驟如下:
插入排序步驟大致如下:
快速排序是由東尼·霍爾所發(fā)展的一種排序算法。在平均狀況下,排序 n 個項(xiàng)目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況并不常見。事實(shí)上,快速排序通常明顯比其他Ο(n log n) 算法更快,因?yàn)樗膬?nèi)部循環(huán)(inner loop)可以在大部分的架構(gòu)上很有效率地被實(shí)現(xiàn)出來,且在大部分真實(shí)世界的數(shù)據(jù),可以決定設(shè)計(jì)的選擇,減少所需時間的二次方項(xiàng)之可能性。
步驟:
從數(shù)列中挑出一個元素,稱為 “基準(zhǔn)”(pivot),
重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個稱為分區(qū)(partition)操作。
遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。
用php寫一個簡單的算法
倆個數(shù)組是不對等的哈 那$arr1循環(huán)到第10次的時候我 $arr2繼續(xù)向下還是回到最初
假如從$arr1[6]開始循環(huán) 得到的是$arr1[6].$arr2[0], 那再次回到$arr1[6]時是$arr1[6].$arr2[0] 還是$arr1[6].$arr2[11]
PHP二分查找算法的實(shí)現(xiàn)方法示例
本文實(shí)例講述了PHP二分查找算法的實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
二分查找法需要數(shù)組是一個有序的數(shù)組
假設(shè)我們的數(shù)組是一個遞增的數(shù)組,首先我們需要找到數(shù)組的中間位置.
1.
要知道中間位置就需要知道起始位置和結(jié)束位置,然后取出中間位置的值來和我們的值做對比。
2.
如果中間值大于我們的給定值,說明我們的值在中間位置之前,此時需要再次二分,因?yàn)樵谥虚g之前,所以我們需要變的值是結(jié)束位置的值,此時結(jié)束位置的值應(yīng)該是我們此時的中間位置。
3.
反之,如果中間值小于我們給定的值,那么說明給定值在中間位置之后,此時需要再次將后一部分的值進(jìn)行二分,因?yàn)樵谥虚g值之后,所以我們需要改變的值是開始位置的值,此時開始位置的值應(yīng)該是我們此時的中間位置,直到我們找到指定值。
4.
或者中間值等于最初的起始位置,或結(jié)束位置(此時說明給定值未找到),下面我們來用代碼實(shí)現(xiàn)~
//循環(huán)實(shí)現(xiàn)
function
getValue($num,$arr)
{
//查找數(shù)組的中間位置
$length=count($arr);
$start=0;
$end=$length;
$middle=floor(($start+$end)/2);
//循環(huán)判斷
while($start$end-1)
{
if($arr[middle]==$num)
{
return
middle+1;
}
elseif($arr[middle]$num)
{
//如果當(dāng)前要查找的值比當(dāng)前數(shù)組的中間值還要打,那么意味著該值在數(shù)組的后半段
//所以起始位置變成當(dāng)前的middle的值,end位置不變。
$start=$middle;
$middle=floor(($start+$end)/2);
}
else{
//反之
$end=$middle;
$middle=floor(($start+$end)/2);
}
}
return
false;
}
//遞歸實(shí)現(xiàn)
/*
*
從數(shù)組中獲取元素值
*
@param1
int
$num,要查找的目標(biāo)值
*
@param2
array
$arr,要查找的數(shù)組
*
@param3
int
$start,查找的起始位置
*
@param4
int
$end,查找的結(jié)束位置
*
@return
mixed,找到了返回位置,沒找到返回false
*/
function
getValue4($num,$arr,$start
=
0,$end
=
100){
//采用二分法查找
$middle
=
floor(($end
+
$start)
/
2);
//判斷
if($arr[$middle]
==
$num){
//已經(jīng)找到了,遞歸的出口
return
$middle
+
1;
}elseif($arr[$middle]
$num){
//要查找的元素在數(shù)組的后半段
$start
=
$middle
+
1;
//邊界值
if($start
=
$end){
//沒有找到,但是已經(jīng)超出邊界值,遞歸出口
return
false;
}
//調(diào)用自己去查找:遞歸點(diǎn)
return
getValue4($num,$arr,$start,$end);
//getValue4($num,$arr,51,100)
}else{
//要查找的元素在數(shù)組的前半段
$end
=
$middle
-
1;
//判斷邊界值
if($end
0)return
false;
//調(diào)用自己:遞歸點(diǎn)
return
getValue4($num,$arr,$start,$end);
//getValue4($num,$arr,0,49)
}
//都沒有找到
return
false;
}
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《PHP基本語法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》及《php查找技巧與方法總結(jié)》
希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。
本文標(biāo)題:php兩組數(shù)據(jù)算法 php數(shù)據(jù)結(jié)構(gòu)與算法
網(wǎng)頁地址:http://fisionsoft.com.cn/article/doceiho.html