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

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

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

    隨筆 - 16  文章 - 42  trackbacks - 0
    <2007年12月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    失業(yè)中…

    常用鏈接

    留言簿(7)

    隨筆檔案(16)

    技術(shù)Blog

    搜索

    •  

    最新隨筆

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    全排列算法的遞歸與非遞歸實(shí)現(xiàn).出于語(yǔ)言特性問題,運(yùn)行效率較低.
    < 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.找到所有排列中最小的一個(gè)排列P.
    ????2.找到剛剛好比P大比其它都小的排列Q,
    ????3.循環(huán)執(zhí)行第二步,直到找到一個(gè)最大的排列,算法結(jié)束.
    下面用數(shù)學(xué)的方法描述:
    給定已知序列?P?=??A1A2A3An?(?Ai!=Aj?,?(1<=i<=n??,?1<=j<=n,?i?!=?j??)?)
    找到P的一個(gè)最小排列Pmin?=?P1P2P3Pn??有??Pi?>?P(i-1)?(1?<?i?<=?n)
    從Pmin開始,總是目前得到的最大的排列為輸入,得到下一個(gè)排列.
    方法為:
    1.從低位到高位(從后向前),找出“不符合趨勢(shì)”的數(shù)字。即找到一個(gè)Pi,使Pi?<?P(i+1)。
    ??若找不到這樣的pi,說(shuō)明我們已經(jīng)找到最后一個(gè)全排列,可以返回了。
    2.在?P(i+1)P(i+2)Pn?中,找到一個(gè)Pj,便得?Pj"剛剛好大于"Pi.?
    ??("剛剛好大于"的意思是:在?P(i+1)P(i+2)Pn?中所有大于Pi的元素構(gòu)成的集合中最小的元素.)
    3.交換?Pi?,?Pj?的位置.注意:此處不改變i和j的值,改變的是Pi和Pj.
    4.交換后,?P1P2P3Pn??并不是準(zhǔn)確的后一個(gè)排列。因?yàn)楦鶕?jù)第1步的查找,我們有P(i+1)?>?P(i+2)?>?.?>?Pn
    ??即使進(jìn)行了Pi和Pj的交換,這仍然是這一部分最大的一個(gè)排列。將此排列逆序倒置(變成最小的排列)即為所求的下一個(gè)排列.
    5.重復(fù)步驟1-4,直到步驟1中找不到“不符合趨勢(shì)”的數(shù)字.
    */

    // 參數(shù)arr:待進(jìn)行全排列的數(shù)組(沒有重復(fù)的元素)
    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]) {? // 找到了"不符合趨勢(shì)"的數(shù)字
    ???????????? 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 ;? // 找不到"不符合趨勢(shì)"的數(shù)字,說(shuō)明所有的排列已經(jīng)找到
    }

    /*
    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 梅雪香 閱讀(11225) 評(píng)論(8)  編輯  收藏

    FeedBack:
    # re: 全排列算法的遞歸與非遞歸實(shí)現(xiàn) 2007-09-11 17:05 roadtang
    做的很漂亮. 學(xué)習(xí).  回復(fù)  更多評(píng)論
      
    # re: 全排列算法的遞歸與非遞歸實(shí)現(xiàn) 2007-09-11 17:08 roadtang
    還有, 愿樓主早日找工作, 樓主失業(yè)一定是哪個(gè)公司的損失  回復(fù)  更多評(píng)論
      
    # re: 全排列算法的遞歸與非遞歸實(shí)現(xiàn) 2007-12-08 18:12 yisoutong
    朋友,請(qǐng)問你的函數(shù)如何修改呢

    我要從字符串"1,2,3,4,5"中取出任意對(duì)字符來(lái)重新排列

    比如:

    '取任意2個(gè)重新排列
    1,2
    1,3
    1,4

    2,1 '去掉重復(fù)的
    2,3
    2,4

    3,1 '去掉重復(fù)的
    3,2
    3,4

    4,1 '去掉重復(fù)的
    4,2 '去掉重復(fù)的
    4,3'去掉重復(fù)的

      回復(fù)  更多評(píng)論
      
    # re: 全排列算法的遞歸與非遞歸實(shí)現(xiàn) 2007-12-08 18:18 yisoutong
    朋友,請(qǐng)問你的函數(shù)如何修改呢

    我要從字符串"1,2,3,4"中取出任意對(duì)字符來(lái)重新排列

    比如:

    '取任意2個(gè)重新排列
    1,2
    1,3
    1,4

    2,1 '去掉重復(fù)的
    2,3
    2,4

    3,1 '去掉重復(fù)的
    3,2
    3,4

    4,1 '去掉重復(fù)的
    4,2 '去掉重復(fù)的
    4,3'去掉重復(fù)的


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

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精品亚洲专区无码不卡| 免费中文熟妇在线影片| 综合一区自拍亚洲综合图区| 亚洲Av综合色区无码专区桃色| 免费黄色大片网站| 成人免费大片免费观看网站| 三上悠亚在线观看免费| 色www免费视频| 亚洲免费综合色在线视频| 亚洲福利秒拍一区二区| 国产AV无码专区亚洲AVJULIA| 亚洲人成无码网WWW| 国产一区二区免费在线| 好男人www免费高清视频在线 | 成人免费一区二区无码视频| 无码AV片在线观看免费| 最近更新免费中文字幕大全| 一个人免费观看视频在线中文| 亚洲AV无码AV吞精久久| 亚洲人成毛片线播放| 亚洲黄色免费网址| 亚洲国产精品久久| 亚洲人成网站在线播放影院在线 | 国精产品一区一区三区免费视频 | 日韩免费高清视频| 成人在线视频免费| 成人av免费电影| 免费无码又爽又刺激高潮的视频 | 精品国产日韩亚洲一区91| 日本亚洲免费无线码 | 免费H网站在线观看的| 亚洲一区免费在线观看| 三年片在线观看免费大全电影 | 久久亚洲中文字幕精品一区四| 国产国拍亚洲精品福利 | 国产成人亚洲精品91专区高清| 亚洲.国产.欧美一区二区三区| 日韩在线视精品在亚洲| 一级看片免费视频| 成人免费ā片在线观看| 日韩免费电影网址|