<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 16  文章 - 42  trackbacks - 0
    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    失業中…

    常用鏈接

    留言簿(7)

    隨筆檔案(16)

    技術Blog

    搜索

    •  

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    全排列算法的遞歸與非遞歸實現.出于語言特性問題,運行效率較低.
    < script?language = " JavaScript " >
    <!--
    // 全排列遞歸算法
    //
    code?by?meixx(梅雪香)
    /*
    遞歸的算法采用分而治之的思想?
    考慮序列?P1P2P3Pn?可以分解為?P1?+?C(P2P3Pn),依此類推.
    */

    function ?combination(arr) {
    ????
    var ?len? = ?arr.length;
    ????
    if (len? == ? 2 ) {
    ????????
    var ?a? = ?arr[ 0 ],?b? = ?arr[ 1 ];
    ????????
    return ?[a + b,b + a];
    ????}

    ????
    else ? if (len? == ? 1 )?? return ?arr;
    ????
    else {
    ????????
    var ?strRtn? = ? "" ;
    ????????
    for ( var ?i = 0 ;i < len;i ++ ) {
    ????????????strRtn?
    += ?merge(arr[i],combination(arr.slice( 0 ,i).concat(arr.slice(i + 1 ,len)))).join( " , " ) + " , " ;
    ????????}

    ????????
    return ?strRtn.replace( / \,$ / , "" ).split( " , " );
    ????}

    }

    function ?merge(head,arr) {
    ????
    for ( var ?i = 0 ;i < arr.length;i ++ )
    ????????arr[i]?
    = ?head? + ?arr[i];
    ????
    return ?arr;
    }

    /*
    var?ar?=?combination("54321".split(""));
    for(var?i=0;i<ar.length;i++)
    ????document.write(ar[i].join(""),"<br>");
    */

    // -->
    </ script >
    < script?language = " JavaScript " >
    <!--
    // 全排列非遞歸算法
    //
    code?by?meixx(梅雪香)
    /*
    非遞歸全排列算法的基本思想是:
    ????1.找到所有排列中最小的一個排列P.
    ????2.找到剛剛好比P大比其它都小的排列Q,
    ????3.循環執行第二步,直到找到一個最大的排列,算法結束.
    下面用數學的方法描述:
    給定已知序列?P?=??A1A2A3An?(?Ai!=Aj?,?(1<=i<=n??,?1<=j<=n,?i?!=?j??)?)
    找到P的一個最小排列Pmin?=?P1P2P3Pn??有??Pi?>?P(i-1)?(1?<?i?<=?n)
    從Pmin開始,總是目前得到的最大的排列為輸入,得到下一個排列.
    方法為:
    1.從低位到高位(從后向前),找出“不符合趨勢”的數字。即找到一個Pi,使Pi?<?P(i+1)。
    ??若找不到這樣的pi,說明我們已經找到最后一個全排列,可以返回了。
    2.在?P(i+1)P(i+2)Pn?中,找到一個Pj,便得?Pj"剛剛好大于"Pi.?
    ??("剛剛好大于"的意思是:在?P(i+1)P(i+2)Pn?中所有大于Pi的元素構成的集合中最小的元素.)
    3.交換?Pi?,?Pj?的位置.注意:此處不改變i和j的值,改變的是Pi和Pj.
    4.交換后,?P1P2P3Pn??并不是準確的后一個排列。因為根據第1步的查找,我們有P(i+1)?>?P(i+2)?>?.?>?Pn
    ??即使進行了Pi和Pj的交換,這仍然是這一部分最大的一個排列。將此排列逆序倒置(變成最小的排列)即為所求的下一個排列.
    5.重復步驟1-4,直到步驟1中找不到“不符合趨勢”的數字.
    */

    // 參數arr:待進行全排列的數組(沒有重復的元素)
    function ?Combin(arr) {
    ????
    var ?arResult? = ?[];
    ????
    var ?ar? = ?arr.sort();
    ????arResult.push(ar);
    ????
    for (;;) {
    ????????ar?
    = ?FindNext(arResult[ 0 ],ar);
    ????????
    if ( ! ar)? return ?arResult;
    ????????arResult.push(ar);
    ????}

    }

    function ?FindNext(arFirst,arLast) {
    ????
    for ( var ?i = arLast.length - 1 ;i > 0 ;i -- ) {
    ????????
    if (arLast[i - 1 ]? < ?arLast[i]) {? // 找到了"不符合趨勢"的數字
    ???????????? var ?ar? = ?arLast.slice();
    ????????????
    var ?strTail? = ?ar.slice(i).join( "" );
    ????????????
    var ?tmpStr? = ?arFirst.join( "" );
    ????????????
    var ?strSearch? = ?tmpStr.substr(?tmpStr.indexOf(ar[i - 1 ])? + ? 1 ?);
    ????????????
    // 確定ar[i-1]要交換的字符及該字符的位置
    ???????????? for ( var ?j = 0 ,k = strSearch.length;j < k;j ++ ) {
    ????????????????
    var ?ch? = ?strSearch.charAt(j);
    ????????????????
    var ?idx? = ?strTail.indexOf(ch);
    ????????????????
    if (?idx? >= ? 0 ?)? break ;
    ????????????}

    ????????????ar[i?
    + ?idx]? = ?ar[i - 1 ];
    ????????????ar[i
    - 1 ]? = ?ch;
    ????????????
    return ?ar.slice( 0 ,i).concat(ar.slice(i).reverse());
    ????????}

    ????}

    ????
    return ? null ;? // 找不到"不符合趨勢"的數字,說明所有的排列已經找到
    }

    /*
    var?ar?=?Combin("f4e3r21".split(""));
    for(var?i=0;i<ar.length;i++)
    ????document.write(ar[i].join(""),"<br>");
    */

    // -->
    </ script >

    posted on 2006-10-21 12:15 梅雪香 閱讀(11224) 評論(8)  編輯  收藏

    FeedBack:
    # re: 全排列算法的遞歸與非遞歸實現 2007-09-11 17:05 roadtang
    做的很漂亮. 學習.  回復  更多評論
      
    # re: 全排列算法的遞歸與非遞歸實現 2007-09-11 17:08 roadtang
    還有, 愿樓主早日找工作, 樓主失業一定是哪個公司的損失  回復  更多評論
      
    # re: 全排列算法的遞歸與非遞歸實現 2007-12-08 18:12 yisoutong
    朋友,請問你的函數如何修改呢

    我要從字符串"1,2,3,4,5"中取出任意對字符來重新排列

    比如:

    '取任意2個重新排列
    1,2
    1,3
    1,4

    2,1 '去掉重復的
    2,3
    2,4

    3,1 '去掉重復的
    3,2
    3,4

    4,1 '去掉重復的
    4,2 '去掉重復的
    4,3'去掉重復的

      回復  更多評論
      
    # re: 全排列算法的遞歸與非遞歸實現 2007-12-08 18:18 yisoutong
    朋友,請問你的函數如何修改呢

    我要從字符串"1,2,3,4"中取出任意對字符來重新排列

    比如:

    '取任意2個重新排列
    1,2
    1,3
    1,4

    2,1 '去掉重復的
    2,3
    2,4

    3,1 '去掉重復的
    3,2
    3,4

    4,1 '去掉重復的
    4,2 '去掉重復的
    4,3'去掉重復的


      回復  更多評論
      
    # re: 全排列算法的遞歸與非遞歸實現 2007-12-10 12:14 梅雪香
    沒有看明白你的意思  回復  更多評論
      
    # re: 全排列算法的遞歸與非遞歸實現 2007-12-11 21:48 void
    ..........太垃圾了..竟然還要用IF&&這么冗余..  回復  更多評論
      
    # re: 全排列算法的遞歸與非遞歸實現[未登錄] 2008-09-18 17:32 null
    謝謝。
    找了好些網頁。你這個講的最清楚。  回復  更多評論
      
    # re: 全排列算法的遞歸與非遞歸實現 2009-05-22 09:11 美元
    不錯還可以!  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲人成电影网站| a级成人免费毛片完整版| 亚洲av日韩av无码| 亚洲福利视频一区二区| 亚洲日韩激情无码一区| 日本免费一二区在线电影| 99视频全部免费精品全部四虎| 黄床大片免费30分钟国产精品| 狠狠综合亚洲综合亚洲色| 亚洲三级视频在线| 亚洲欧洲综合在线| 亚洲韩国—中文字幕| 精品国产亚洲一区二区三区| 最近的中文字幕大全免费8| 日韩av无码免费播放| 久久久久久噜噜精品免费直播| 羞羞视频免费网站入口| 亚洲精品无码一区二区| 亚洲www在线观看| 亚洲av极品无码专区在线观看| 亚洲日本香蕉视频| 亚洲电影免费观看| 亚洲成年人电影在线观看| 久久精品国产亚洲AV高清热 | 自拍日韩亚洲一区在线| 久久亚洲AV无码精品色午夜麻豆| 久久精品国产亚洲av成人| 精品久久久久久亚洲| 亚洲日本va中文字幕久久| 亚洲色大成网站www永久一区| 丁香五月亚洲综合深深爱| 国产亚洲精品线观看动态图| 国产亚洲大尺度无码无码专线| 久久影院亚洲一区| 国产成人亚洲综合无码精品| 日本红怡院亚洲红怡院最新| 人人狠狠综合久久亚洲88| 亚洲精品视频观看| 国产色在线|亚洲| 亚洲国产高清国产拍精品| 美女露100%胸无遮挡免费观看|