首页 > 新闻动态 >  

新闻动态
NEWS

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


..

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