zoukankan      html  css  js  c++  java
  • PHP之算法

    PHP之算法偶遇隨感



    要求如下:
        第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成就了快速開發,卻也讓程序員變笨了,看來得惡補一下算法了,在算法方面有沒有啥比較好的書啊?大家可否推薦給我幾本?

    ..

     
     
    分类: 编程
  • 相关阅读:
    pytest文档19-pytest分布式执行(pytest-xdist)
    pytest文档18-配置文件pytest.ini
    pytest文档17-fixture之autouse=True
    pytest文档16-用例a失败,跳过测试用例b和c并标记失败xfail
    pytest文档15-使用自定义标记mark
    pytest文档14-函数传参和fixture传参数request
    pytest文档12-skip跳过用例
    pytest文档11-assert断言
    创建express项目
    docker安装脚本
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3249866.html
Copyright © 2011-2022 走看看