對於HeapAlgorithm的理解

在學全排列算法的時候強行被佈置了打一遍Heap’sAlgorithm。於是習慣性的去百度。。發現百度裏關於這個的資料很少。但是這個算法很古怪。和現在百度上的那些全排序不同,百度上遞歸的都是先固定頭部,再排後面這樣遞歸先去,這個全排序裏面奇偶的全排序操作是不同的。導致了在我看來迷一樣的像隨機排序。可是結果卻一點也不重複,然後就愚蠢的研究了下(用我小學來的出的方法)。想寫一點我的理解。但規律問題還是沒有解開。求高人後面留言解答。謝謝~(發自內心的!)
首先:關於這個算法。百度百科裏有詳細的步驟這裏寫圖片描述
但是。可能我比較笨。無法理解。爲什麼這樣換就能做到全排列??!!
然後我就用java先把代碼給打了出來。


public class HeapAlgorithm 
{
    public static void main(String[] args) 
    {
        char[] arry={'a','b','c'};
        generate(3,arry);
    }
    private static void generate(int n,char[] arry)
    {
        if(n==1)
      System.out.println(String.valueOf(arry));
        else
        {
            for(int i=0;i<n-1;i+=1)
            {
                generate(n-1,arry);//用於每種情況的一開始打印
                if(n%2==0)
                    swap(arry,i,n-1);
                else
                    swap(arry,0,n-1);
            }
            generate(n-1,arry);//用於用於交換後的打印
        }
    }
    private static void swap(char[] arry,int a,int b)
    {
        char temp=arry[a];
        arry[a]=arry[b];
        arry[b]=temp;
    }
}   

然後我們就開始嘗試了。就先從abc開始全排列
這裏寫圖片描述
我運行了三次。可以發現一開始由於for循環裏的第一個generate函數。就直接把abc給按順序給輸出了。所以單純的我認爲。for循環裏的第一個generate是用於輸出交換前的狀態。
由於我是三個數。所以當輸出的時候其實嵌套了三個函數。輸出後回溯一個函數。我們此時的n值爲2。然後開始交換。就是第0個和n-1個交換前面開始全排列了。後面的一個數保持不動。
這裏寫圖片描述
就我們這abc情況而言。應該已經交換玩了。所以就應該到後面一個generate去輸出答案。bac
輸出後再次回溯。就是當n=3的情況。回來了最外面的函數了。然後開始交換。先是奇數。所以是第一個和最後一個開始交換。然後就到下一層。。變成cab
有了剛剛的經驗。我們應該能想到下面就會是acb,
bca,cba這裏寫圖片描述看着這個結果。我好像找到了一點點規律。但是不確定。於是我們再來看下到4個數結果這裏寫圖片描述
哈哈。看。首先最後一位都是
固定住了。是dcba。然後再深入。只看末尾是d的數。倒數第二位數是cba,再到裏面就會發現。這樣奇偶分開的操作居然也能這樣有規律的的全排列。而且操作數排序的規律是從後往前固定排序的(和百度裏的那種全排序相反。。23333 ps:不要以爲是dcba cba這樣的順序。到了第五個你們就會發現莫名其妙的變成了ebcda)
然後就是問題的關鍵了。爲什麼要分奇偶去分別操作呢?

愚蠢的我再次採用找規律的方式這裏寫圖片描述
這裏。最後一個我把它定義爲n。爲了我方便查找規律。發現好像發現了一點。主要的交換是在頭部,兩個交換的最多。其次是第一位和第三位,再其次是第四位。只是這樣看。有沒有感覺。好像只是頭和前面的數交換?根本不用區分奇偶?
然後我們再來看看當5個數的時候n的規律!這裏寫圖片描述
幺蛾子來了。。。神他媽c和d交換。。b和a交換。交換的時候都是偶數。而爲什麼是偶數?我們拿數據來看。當只有兩個數的時候是有2個結果。3個數6個結果。n個數n!個結果。n!肯定是偶數。然後我們只看n就不夠了。這是得把i一起加上。我們把i放在n的前面一位!這裏寫圖片描述
如果把i拆分成6個一看(就是3個數全排列的結果)。就發現。第零次是0開頭,第一次的六是0開頭。第二次是1開頭第三次是2開頭。
然後我們可能會假想。會不會然後出來第三波是3開頭的?這裏寫圖片描述這裏寫圖片描述
然後我對這些數據做了個簡化處理。把i爲0的給去除掉。
發現能夠輸出來的。n也有規律。。4和6。。i爲3的只有一個。交換的根據算法來說是c和d。這樣下去。。
然後我就懵逼了。。但至少我解決了。。知道爲啥要分奇偶。因爲通過數據來看要達到全排列。肯定得全部輪換一遍而奇數的條件在有5個數的時候起作用。但是無法理解。爲啥不是頭和第4個數去交換?而是第2個數去交換。那個外國的高人是怎麼想到n的規律?和這個交換順序直接的關係?讓它做到全排列並且不重複!。還有個神奇的規律沒有探索。呢就是最後一位數字。。它的規律也很神奇啊。一到4位的時候都是dcba這樣倒過來。到了第五位就開始跳了。(加入奇數變化)ebcda 到了6位數就成爲了febcda。真是讓我百思不得騎姐。。。希望有高人來幫忙解答下我的白癡問題。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章