昨天我在開發一個項目的時候遇到了一個難題,就是過關組合的部份,我曾研究過類似的代碼,發現人家循環了7層,看得我眼冒金星,至於效率就更甭提了,於是我就想自己寫一個函數來處理這部份,首先要效率高,其次是要能滿足我的需求,整了半天愣是沒有整出來,下邊是我發在csdn上的一篇求救文:
请帮忙写一个函数,用来重新组合字符串,大概如下:
要求如下:
第1种: a,b,c
期望能够得到的组合是: ab,ac,bc
第2种: a,b,c,d(可通过参数控制结果长度,如长度为2或3)
期望能够得到的组合是: ab,ac,ad,bc,bd,cd或abc,bcd,acd,abd
第3种: a,b,c,d,e(可通过参数控制结果长度,如长度为2;3或4)
期望能够得到的组合是: ab,ac,ad,ae,bc,bd,be,cd,ce,de或abc,bcd,cde,abd,abe,acd,ace,bde,bce,ade或abcd,bcde,abce,acde,abde
第四种:a,b,c,d,e,f(可通过参数控制结果长度,如长度为2;3;4或5)
期望能够得到的组合是: 可根据上边的组合推演出来,在此不再例举
上邊的要求貌似很簡單,但是真正當我開始寫的時候才發現竟然一點頭緒都沒有,我曾設想過用遞歸等做法但是想來想去都覺得不可行,放狗搜了半天也找不到類似的做法,只發現有人用c語言寫過一個函數,但是當我把c語言代碼改成php執行的時候和預期的效果差很大.最後沒辦法只好在csdn花費了寶貴的200點積分請高手來解決,俗話所的好重賞之下有勇夫,哈哈這句話果真一點都不假,很快php版的斑竹xuzuning就給了我三個答案,汗!!!最後通過十萬次的循環測試選中了一個最佳解決方案,代碼如下:
/** 重新組合array,例如(2x3;3x3;3x4) 返回: 重組後的array 參數: $arr:要重組的array $len:幾個array組合到一起 用法: $arr=array('a1','b2','c3','d4','e5','f'); $x3=fun::combiarray($arr,3); /**/ public static function combiarray($arr,$len){ $cr = range(0,$len-1); $k = false; $total = count($arr); while($cr[0] < $total-($len-1)) { $t = array(); for($i=0;$i=0;$i--) { $cr[$i]++; for($j=$i;$j<$len-1;$j++){$cr[$j+1] = $cr[$j]+1;} if($cr[$i] < $total-($len-$i-1)){break;} } } return $r; }
很棒的算法,看了老半天才看明白,比起某人寫的那7層循環不知道效率提升了多少倍.
php成就了快速開發,卻也讓程序員變笨了,看來得惡補一下算法了,在算法方面有沒有啥比較好的書啊?大家可否推薦給我幾本?
..
http://www.bkjia.com/phpjc/440203.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/440203.htmltecharticlephp真的很棒,很多函數把我們想要的功能都簡單實現了,是項目快速開發的首選.說實話,在bs程序開發方面我認為最好的兩種語言是php和jsp,我之...
