含義
排列是組合數學問題,而很多組合數學問題都可以在圖之間進行轉換。樹是一種特殊的圖。在這裡我用一種特殊的樹結構實現排列算法,這種樹就是N層滿N叉樹(N可以是任意自然數)。圖一就是一個三層滿三叉樹。它剛好有3層,並且除葉結點外每節點有3個兒子。利用這種樹的性質我們很容易就能直觀的獲得一個3排列。
設計一個可排列的樹形結構
根節點(000000)
--第一層子節點1(000100)
----第二層子節點1(000101)
----第二層子節點2(000102)
----第三層子節點3(000103)
--第一層子節點2(000200)
----第二層子節點1(000201)
----第二層子節點2(000202)
----第三層子節點3(000203)
--第一層子節點3(000300)
如果按照這樣的排列順序插入資料庫表里。通過dtree的js來實現,因為按照id,從數
據庫取出來的記錄集List已經是一個排列好了的結構,所以把List傳到jsp頁面,再循
環給dtree.add(id,name,parent),這樣實現成樹沒有任何問題。
資料庫表結構如下:
id -- 記錄id
name -- 節點名稱
parent -- 父節點id
現在如果希望把這顆樹當中的節點的排列順序做個調整,把第一層子節點1(000200)和
第一層子節點2(000200)的順序對調。如:
根節點(000000)
--第一層子節點2(000200)
----第二層子節點1(000201)
----第二層子節點2(000202)
----第三層子節點3(000203)
--第一層子節點1(000100)
----第二層子節點1(000101)
----第二層子節點2(000102)
----第三層子節點3(000103)
--第一層子節點3(000300)
這樣dtree好像無法做到,想到的是把傳給頁面的List里已經排好了順序,這樣dtree
才能辦到。問題是,現在如何設計資料庫表,加個欄位,這個欄位放什麼好,怎樣才
能得到一個已經排列好了的List,List裡面的對象順序如下:
根節點(000000)
--第一層子節點2(000200)
----第二層子節點1(000201)
----第二層子節點2(000202)
----第三層子節點3(000203)
--第一層子節點1(000100)
----第二層子節點1(000101)
----第二層子節點2(000102)
----第三層子節點3(000103)
--第一層子節點3(000300)
關於系統排列
系統排列最早由德國的治療師伯特海靈格創立而來。這種治療方法裡,會把個人放在一個更大的整體裡面來觀察,如家庭系統或一個組織,而不是把個人看做一個獨立的實體。需要在這個整體中去理解個人的行為、感受和態度。在任何系統中,我們作為其中一員,那些家庭中的、組織里的潛藏的規則,在不知不覺中影響著我們的行為。讓個案的案主從現場參與者中挑選代表,幫助他完成系統排列,以此把隱藏的系統能量挖掘出來。
舉例
當所給問題的確定n個元素滿足某種性質的排列時,相應的解空間樹稱為排列樹。排列樹通常有n!個葉結點。因此遍歷排列樹需要奧秘加(n!)計算時間。旅行售貨員問題的解空間是一棵排列樹。
回溯法搜尋排列樹的算法一般可以描述如下:
void backtrack(int t) {
if (t > n)
output(x);
else
for (int i = t; i<=n; i++)
{
swap(x[t], x[i]);
if(constraint(t) && bound(t)) backtrack(t+1);
swap(x[t], x[i]);
}
}