生成演算法圖
⑴ 已知一個無向圖如下,分別用普里姆和克魯斯卡爾演算法生成最小生成樹(假設以1為起點,試畫出構造過程)。
1)普里姆演算法思想
從圖中任意取出一個頂點, 把它當成棵樹,然後從與這棵樹相接的邊中選取一條最短(權值最小)的邊, 並將這條邊及其所連接的頂點也並入這棵樹中,此時得到了一棵有兩個頂點的樹。然後從與這棵樹相接的邊中選取一條最短的邊,並將這條邊及其所連頂點並入當前樹中,得到一棵有3個頂點的樹。以此類推,直到圖中所有頂點都被並入樹中為止,此時得到的生成樹就是最小生成樹。
2)克魯斯卡爾演算法思想
先將邊中的權值從小到大排序,每次找出候選邊中權值最小的邊,就將該邊並入生成樹中。重復此過程直到所有邊都被檢測完為止。其中要注意的是克魯斯卡爾演算法需要用到並查集,以此來判斷接下來要並入的邊是否會和已並入的邊構成迴路。這兩個圖分別用普里姆和克魯斯卡爾生成的最小生成樹見圖。
需要注意的是,在接下來要並入的最小權值不唯一的情況下,可以選取的邊是不唯一的,所以其最小生成樹也不唯一。(純手打,望採納,謝謝。)
⑵ 全排列的生成樹
可以採用樹的結構表示全排列生成演算法,以數字的全排列生成演算法為例,從最小的數1開始,其全排列只有一種可能;加入數字2,數字2可以插入在1的後邊或前邊,有兩個不同位置;
再加入3,對於第二層中的每一種不同排列,都可以通過將3插入不同位置得到三種不同的排列數,共有6種排列數;一次類推可以得到 個數的全排列。
基於此,可以構造一種新的中介數,其定義如下:
對於生成樹中的第n層,每一個節點中介數的前n-2位繼承於其父節點的中介數,中介數最後一位為該層新加入的數 減去其右邊相鄰的數。
如果新加入的數在最右邊,則中介數最後一位為0。
如圖所示,排列數12的中介數為0,對於生成樹第三層由節點12擴展得到的新節點,當新加入的數3位於最右邊時(即排列數123),對應的中介數為00;若3插入12中間,則中介數末位為3-2=1,即中介數為01;類似地排列數312對應的中介數為02。
不難看出,生成樹中介數也是遞減進位制數,但和遞減進位制數法是不同的。如排列數231對應的生成樹中介數為12,而遞減進位制數法對應的中介數為11。 不難看出,全排列生成樹每一層的不同節點對應的中介數都是不同的,這是因為:
(1)每個子節點中介數的前綴都從其父節點繼承得到,因此不同父節點生成的子節點中介數一定不同;
(2)同一個父節點生成的子節點,父節點的排列數每一位都是不同的,因此新加入的數插入不同位置得到的中介數的最後一位一定是不同的。
由以上兩點及歸納法即可證明生成樹每一層不同節點對應的中介數都是唯一不重復的。又全排列生成樹每一個節點的排列數是無重復無遺漏的,因此從中介數到排列數的映射是一一對應的,從而基於生成樹中介數的全排列生成演算法是完備的。 由生成樹中介數還原排列數的過程實際上就是全排列生成樹的構建過程。以生成樹中介數121為例:
(1)中介數第一位是1,說明2在1的左邊,得到21;
(2)中介數第二位為2,只能由3-1得到,說明3在1的左鄰,得到231;
(3)中介數第三位為1,只能由4-3得到,說明4在3的左鄰,得到2431.
對於任意的生成樹中介數,都通過類似的過程計算對應的排列數。不難看出,從生成樹中介數還原排列數的時間復雜度也是 。
⑶ 怎麼通過演算法大量生成圖片
首先需要製作一個nodejs小程序,然後通過該程序開始運行演算法,通過小程序的建模生成圖片,這樣就可以通過演算法生成大量的圖片。首先,先介紹廣告創意圖片的整體生成流程:用戶先提供必要的信息,如廣告標題、促銷信息、廣告商品圖等,然後通過介面發送做圖程序。
做圖程序是一個nodejs服務,nodejs會啟動一個後端的headless模式的chrome,我們使用的是puppeteer,然後puppeteer啟動真正的做圖程序。
做圖主程序使用js和canvas進行編寫,js根據傳入的參數,計算出最合適的模板,然後進行配色、配置背景圖、裝飾文本、裝飾商品圖等各種繁瑣細節的操作,最終在HTML里通過canvas渲染出所有的創意圖片。
最後再通過nodejs,做圖完成,nodejs再調用puppeteer計算位置關系等進行截圖,生成最終的圖片。
⑷ [圖] 最小生成樹-Prime演算法和Kruskal演算法
普里姆演算法(Prim演算法),圖論中的一種演算法,可在加權連通圖里搜索最小生成樹。意即由此演算法搜索到的邊子集所構成的樹中,不但包括了連通圖里的所有頂點(英語:Vertex (graph theory)),且其所有邊的權值之和亦為最小。該演算法於1930年由捷克數學家沃伊捷赫·亞爾尼克(英語:Vojtěch Jarník)發現;並在1957年由美國計算機科學家羅伯特·普里姆(英語:Robert C. Prim)獨立發現;1959年,艾茲格·迪科斯徹再次發現了該演算法。因此,在某些場合,普里姆演算法又被稱為DJP演算法、亞爾尼克演算法或普里姆-亞爾尼克演算法。
4 .輸出:使用集合 V new 和 E new 來描述所得到的最小生成樹。
下面對演算法的圖例描述
反證法:假設prim生成的不是最小生成樹
這里記頂點數v,邊數e
鄰接矩陣:O(v 2 )
鄰接表:O(e * log 2 v)
Kruskal演算法是一種用來尋找最小生成樹的演算法,由Joseph Kruskal在1956年發表。用來解決同樣問題的還有 Prime 演算法和 Boruvka 演算法等。三種演算法都是貪婪演算法的應用。和 Boruvka 演算法不同的地方是,Kruskal 演算法在圖中存在相同權值的邊時也有效。
圖例描述:
對圖的頂點數 n 做歸納,證明 Kruskal 演算法對任意 n 階圖適用。
歸納基礎:
n = 1,顯然能夠找到最小生成樹。
歸納過程:
假設 Kruskal 演算法對 n ≤ k 階圖適用,那麼,在 k + 1 階圖 G 中,我們把最短邊的兩個端點 a 和 b 做一個合並操作,即把 u 與 v 合為一個點 v',把原來接在 u 和 v 的邊都接到 v' 上去,這樣就能夠得到一個 k階圖 G'(u ,v 的合並是 k + 1 少一條邊),G' 最小生成樹 T' 可以用Kruskal 演算法得到。
我們證明 T' + {<u,v>} 是 G 的最小生成樹。
用反證法,如果 T' + {<u,v>} 不是最小生成樹,最小生成樹是 T,即W(T) < W(T' + {<u,v>})。顯然 T 應該包含 <u,v>,否則,可以用<u,v> 加入到 T 中,形成一個環,刪除環上原有的任意一條邊,形成一棵更小權值的生成樹。而T - {<u,v>},是 G' 的生成樹。所以 W(T-{<u,v>}) <= W(T'),也就是 W(T) <= W(T') + W(<u,v>) = W(T'+{<u,v>}),產生了矛盾。於是假設不成立,T' + {<u,v>}是 G 的最小生成樹,Kruskal 演算法對 k+1 階圖也適用。
由數學歸納法,Kruskal 演算法得證。
e * log 2 e (e為圖中的邊數)