探討應(yīng)當(dāng)如何提高PHP遞歸效率
我們?cè)趯?shí)際代碼編程中,會(huì)發(fā)現(xiàn)PHP遞歸效率是非常低下的,對(duì)于程序員來說,他們必須要很好的處理PHP的遞歸。在這篇文章中我們具體向大家介紹了PHP遞歸效率的提高方法,希望對(duì)又需要的朋友有所幫助。
最近寫了一個(gè)快速排序的算法,發(fā)現(xiàn)PHP中的遞歸效率不能一刀切,在各種不同的服務(wù)器中,可能會(huì)表現(xiàn)不一樣。
- function qsort(&$arr)
- {
- _quick_sort($arr, 0, count($arr) - 1);
- }
- /**
- * 采用遞歸算法的快速排序。
- *
- * @param array $arr 要排序的數(shù)組
- * @param int $low ***的排序子段
- * @param int $high ***的排序字段
- */
- function _quick_sort(&$arr, $low, $high)
- {
- $low_data = $arr[$low];
- $prev_low = $low;
- $prev_high = $high;
- while ($low < $high)
- {
- while ($arr[$high] >= $low_data && $low < $high) {
- $high--;
- }
- if ($low < $high) {
- $arr[$low] = $arr[$high];
- $low++;
- }
- while ($arr[$low] <= $low_data && $low < $high) {
- $low++;
- }
- if ($low < $high) {
- $arr[$high] = $arr[$low];
- $high--;
- }
- }
- $arr[$low] = $low_data;
- if ($prev_low < $low) {
- _quick_sort($arr, $prev_low, $low);
- }
- if ($low + 1 < $prev_high) {
- _quick_sort($arr, $low + 1, $prev_high);
- }
- }
- function quick_sort(&$arr)
- {
- $stack = array();
- array_push($stack, 0);
- array_push($stack, count($arr) -1);
- while (!empty($stack)) {
- $high = array_pop($stack);
- $low = array_pop($stack);
- $low_data = $arr[$low];
- $prev_low = $low;
- $prev_high = $high;
- while ($low < $high)
- {
- while ($arr[$high] >= $low_data && $low < $high) {
- $high--;
- }
- if ($low < $high) {
- $arr[$low] = $arr[$high];
- $low++;
- }
- while ($arr[$low] <= $low_data && $low < $high) {
- $low++;
- }
- if ($low < $high) {
- $arr[$high] = $arr[$low];
- $high--;
- }
- }
- $arr[$low] = $low_data;
- if ($prev_low < $low) {
- array_push($stack, $prev_low);
- array_push($stack, $low);
- }
- if ($low + 1 < $prev_high) {
- array_push($stack, $low + 1);
- array_push($stack, $prev_high);
- }
- }
- }
下面是PHP遞歸效率測(cè)試速度的代碼:
- function qsort_test1()
- {
- $arr = range(1, 1000);
- shuffle($arr);
- $arr2 = $arr;
- $t1 = microtime(true);
- quick_sort($arr2);
- $t2 = microtime(true) - $t1;
- echo "非遞歸調(diào)用的花費(fèi):" . $t2 . "\n";
- $arr1 = $arr;
- $t1 = microtime(true);
- qsort($arr1);
- $t2 = microtime(true) - $t1;
- echo "遞歸調(diào)用的花費(fèi):" . $t2 . "\n";
- }
#t#在我的IIS 服務(wù)器上(CGI)模式,我的PHP遞歸效率測(cè)試結(jié)果是:
非遞歸調(diào)用的花費(fèi):0.036401009559631
遞歸調(diào)用的花費(fèi):0.053439617156982
在我的Apache 服務(wù)器上,我的測(cè)試結(jié)果是:
非遞歸調(diào)用的花費(fèi):0.022789001464844
遞歸調(diào)用的花費(fèi):0.014809131622314
PHP遞歸效率的結(jié)果完全相反,而PHP的版本是一樣的。
看來對(duì)PHP遞歸效率要具體問題具體分析了。