} } }

    PHP之算法偶遇隨感

    添加时间:2013-8-10 点击量:

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


    ..

    我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
    分享到: