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

    ..

  • 相关阅读:
    桟错误分析方法
    gstreamer调试命令
    sqlite的事务和锁,很透彻的讲解 【转】
    严重: Exception starting filter struts2 java.lang.NullPointerException (转载)
    eclipse 快捷键
    POJ 1099 Square Ice
    HDU 1013 Digital Roots
    HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)
    HDU 1159 Common Subsequence
    HDU 1069 Monkey and Banana(动态规划)
  • 原文地址:https://www.cnblogs.com/see7di/p/3249211.html
Copyright © 2011-2022 走看看