PHP之算法偶遇隨感

    php真的很棒,很多函數把我們想要的功能都簡單實現了,是項目快速開發的首選.說實話,在BS程序開發方面我認為最好的兩種語言是PHP和JSP,我之前曾學過一段時間的java,確實很棒完全的OOP,但是它太"龜毛"了,雖然他的優點有很多,但是想要實現快速開發幾乎是不大可能的,太多的東西需要遵循,而在這方面PHP就好的太多了,但是也正因為如此讓眾多的PHPER們忽略了算法的重要性,好了言歸正傳我們今天就來討論一個算法.

    昨天我在開發一個項目的時候遇到了一個難題,就是過關組合的部份,我曾研究過類似的代碼,發現人家循環了7層,看得我眼冒金星,至於效率就更甭提了,於是我就想自己寫一個函數來處理這部份,首先要效率高,其次是要能滿足我的需求,整了半天愣是沒有整出來,下邊是我發在CSDN上的一篇求救文:

请帮忙写一个函数,用来重新组合字符串,大概如下:
    
/**
参数:
    $arr:需要被重新組合的原始Array
    $len:组合后的长度
/**/
Function getArray($arr,$len){
    //请帮忙写
}
$arr=Array('A','B','C');
print_r(getArray($arr,2));
 
$arr=Array('A','B','C','D','E','F');
print_r(getArray($arr,4));


要求如下:
    第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<$len;$i++){$t[]=$arr[$cr[$i]];}
        $r[] = $t;
 
        For($i=$len-1;$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成就了快速開發,卻也讓程序員變笨了,看來得惡補一下算法了,在算法方面有沒有啥比較好的書啊?大家可否推薦給我幾本?

..

posted @   已經停更  阅读(1468)  评论(2编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示