當前位置:首頁 » 操作系統 » wij演算法

wij演算法

發布時間: 2024-07-07 00:11:03

㈠ 圖的存儲結構——所存儲的信息有哪些

一、鄰接矩陣存儲方法

鄰接矩陣是表示頂點之間相鄰關系的矩陣。

設G=(V,E)是具有n(n>0)個頂點的圖,頂點的順序依次為0~n-1,則G的鄰接矩陣A是n階方陣,其定義如下:

(1)如果G是無向圖,則:

A[i][j]=1:若(i,j)∈E(G) 0:其他

(2)如果G是有向圖,則:

A[i][j]=1:若<i,j>∈E(G) 0:其他

(3)如果G是帶權無向圖,則:

A[i][j]= wij :若i≠j且(i,j)∈E(G) 0:i=j ∞:其他

(4)如果G是帶權有向圖,則:

A[i][j]= wij :若i≠j且<i,j>∈E(G) 0:i=j∞:其他

注意:帶權圖和不帶權圖表示的元素類型不同。


帶權圖(不論有向還是無向圖)A[i][j]用double表示,不帶權圖(不論有向還是無向圖)A[i][j]用int表示。

用一維數組G[ ]存儲有4個頂點的無向圖如:G[ ] = { 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 }

則頂點2和頂點0之間是有邊的。

如:

鄰接矩陣的特點如下:

(1)圖的鄰接矩陣表示是唯一的。

(2)無向圖的鄰接矩陣一定是一個對稱矩陣。因此,按照壓縮存儲的思想,在具體存放鄰接矩陣時只需存放上(或下)三角形陣的元素即可。

(3)不帶權的有向圖的鄰接矩陣一般來說是一個稀疏矩陣。因此,當圖的頂點較多時,可以採用三元組表的方法存儲鄰接矩陣。

(4)對於無向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的度。

(5)對於有向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的出度(或入度)。

(6)用鄰接矩陣方法存儲圖,很容易確定圖中任意兩個頂點之間是否有邊相連。但是,要確定圖中有多少條邊,則必須按行、按列對每個元素進行檢測,所花費的時間代價很大。這是用鄰接矩陣存儲圖的局限性。

鄰接矩陣的數據類型定義如下:

#define MAXV <最大頂點個數>

typedef struct

{ int no; //頂點編號

InfoType info; //頂點其他信息

} VertexType; //頂點類型

typedef struct //圖的定義

{ int edges[MAXV][MAXV]; //鄰接矩陣

int n,e; //頂點數,弧數

VertexType vexs[MAXV]; //存放頂點信息

} MGraph; //圖的鄰接矩陣表示類型


二、 鄰接表存儲方法

圖的鄰接表存儲方法是一種順序分配與鏈式分配相結合的存儲方法。

在鄰接表中,對圖中每個頂點建立一個單鏈表,第i個單鏈表中的節點表示依附於頂點i的邊(對有向圖是以頂點i為尾的邊)。每個單鏈表上附設一個表頭節點。

其中,表節點由三個域組成,adjvex指示與頂點i鄰接的點在圖中的位置,nextarc指示下一條邊或弧的節點,info存儲與邊或弧相關的信息,如權值等。

表頭節點由兩個域組成,data存儲頂點i的名稱或其他信息,firstarc指向鏈表中第一個節點。

typedef struct ANode

{ int adjvex; //該邊的終點編號

struct ANode *nextarc; //指向下一條邊的指針

InfoType info; //該邊的相關信息

} ArcNode; //邊表節點類型


typedef struct Vnode

{ Vertex data; //頂點信息

ArcNode *firstarc; //指向第一條邊

} VNode; //鄰接表頭節點類型

typedef VNode AdjList[MAXV]; //AdjList是鄰接表類型

typedef struct

{ AdjList adjlist; //鄰接表

int n,e; //圖中頂點數n和邊數e

} ALGraph; //完整的圖鄰接表類型


鄰接表的特點如下:

(1)鄰接表表示不唯一。這是因為在每個頂點對應的單鏈表中,各邊節點的鏈接次序可以是任意的,取決於建立鄰接表的演算法以及邊的輸入次序。

(2)對於有n個頂點和e條邊的無向圖,其鄰接表有n個頂點節點和2e個邊節點。顯然,在總的邊數小於n(n-1)/2的情況下,鄰接表比鄰接矩陣要節省空間。

(3)對於無向圖,鄰接表的頂點i對應的第i個鏈表的邊節點數目正好是頂點i的度。

(4)對於有向圖,鄰接表的頂點i對應的第i個鏈表的邊節點數目僅僅是頂點i的出度。其入度為鄰接表中所有adjvex域值為i的邊節點數目。

例, 給定一個具有n個節點的無向圖的鄰接矩陣和鄰接表。

(1)設計一個將鄰接矩陣轉換為鄰接表的演算法;

(2)設計一個將鄰接表轉換為鄰接矩陣的演算法;

(3)分析上述兩個演算法的時間復雜度。

解:

(1)在鄰接矩陣上查找值不為0的元素,找到這樣的元素後創建一個表節點並在鄰接表對應的單鏈表中採用前插法插入該節點。

void MatToList(MGraph g,ALGraph *&G)

//將鄰接矩陣g轉換成鄰接表G

{ int i,j,n=g.n; ArcNode *p; //n為頂點數

G=(ALGraph *)malloc(sizeof(ALGraph));

for (i=0;i<n;i++) //給所有頭節點的指針域置初值

G->adjlist[i].firstarc=NULL;

for (i=0;i<n;i++) //檢查鄰接矩陣中每個元素

for (j=n-1;j>=0;j--)

if (g.edges[i][j]!=0)

{ p=(ArcNode *)malloc(sizeof(ArcNode));

//創建節點*p

p->adjvex=j;

p->nextarc=G->adjlist[i].firstarc;

//將*p鏈到鏈表頭

G->adjlist[i].firstarc=p;

}

G->n=n;G->e=g.e;


}


(2)在鄰接表上查找相鄰節點,找到後修改相應鄰接矩陣元素的值。

void ListToMat(ALGraph *G,MGraph &g)

{ int i,j,n=G->n;ArcNode *p;

for (i=0;i<n;i++)

{ p=G->adjlist[i].firstarc;

while (p!=NULL)

{ g.edges[i][p->adjvex]=1;

p=p->nextarc;

}

}

g.n=n;g.e=G->e;

}


(3)演算法1的時間復雜度均為O(n2)。演算法2的時間復雜度為O(n+e),其中e為圖的邊數。

㈡ 貪心演算法

平面點集三角剖分的貪心演算法要求三角剖分後邊的總長度盡可能小。演算法的基本思想是將所有的兩點間距離從小到大排序,依次序每次取一條三角剖分的邊,直至達到要求的邊數。以下是兩種貪心演算法的主要步驟。

3.2.2.1 貪心演算法1

第一步:設置一個記錄三角剖分中邊的數組T。

第二步:計算點集S中所有點對之間的距離d(pi,pj),1≤i,j≤n,i≠j,並且對距離從小到大進行排序,設為d1,d2,…,dn(n-1)/2,相應的線段記為e1,e2,…,en(n-1)/2,將這些線段存儲在數組E中。

第三步:從線段集E中取出長度最短的邊e1存到T中作為三角剖分的第一條邊,此時k=1。

第四步:依次從E中取出長度最短的邊ek,與T中已有的邊進行求交運算,如果不相交則存到T中,並從E中刪除ek。這一步運行到S中沒有邊為止,即至k=n(n-1)/2。

第五步:輸出T。

該演算法中,第二步需要計算n(n-1)/2次距離,另外距離排序需要O(n2lgn)次比較。T中元素隨第四步循環次數的增加而增加,因此向T中加入一條新邊所需要的判定兩條線段是否相交的次數也隨之增加。如果第四步的前3n-6次循環後已經構成點集的三角剖分,那麼第四步循環所需要的判定兩條線段是否相交的次數為

1+2+…+3n-7+(3n-6)×(n(n-1)/2-(3n-6))=O(n3)

在常數時間內可以判定兩條線段是否相交,因此該演算法的時間復雜性為O(n3)。

3.2.2.2 貪心演算法2

第一步:求點集的凸殼,設凸殼頂點為p1,p2,…,pm,凸殼的邊為e1,e2,…,em。並將凸殼頂點按順序連接成邊的ei加入T(三角剖分的邊集合),並且ei的權值被賦為1。凸殼內點的集合為S1={pm+1,pm+2,…,pn}。

第二步:從內部點S1中任取一點pi,求與pi距離最近的點pj,將線段 存入T。

第三步:求與pj距離最近的點(除點pi外),設為pk,並將線段 加入T,並將這些邊的權值設為1,而wij、wjk和wki的值加1,即為2。邊的權值為2則表示該邊為兩個三角形共有。

第五步:對權值為1的邊(除e1,e2,…,em外)的兩個端點分別求與其距離最近的點,並將其連線(得到新的三角形)加入T,新三角形邊的權值加1。

第六步:對權值為1的邊重復上一步,當一條邊被使用一次其權值增加1,直到所有邊的權值均為2為止(除e1,e2,…,em外)。

貪心演算法2中,第一步耗費O(nlgn);第二步需要計算n-1次距離與n-2次比較;第三步求pk要計算n-2次的距離與n-3次比較;第四步要進行(n-3)×3次的距離計算及(n-4)×3次比較;第五步至多進行n-6次的距離計算與n-7次比較;第六步到第五步的循環次數不超過3n-9;因此整個貪心演算法2的時間復雜性為

O(nlgn)+O(n)+O(n)+O(n)+(n-6)×(3n-9)=O(n2)

㈢ 紲炵粡緗戠粶鍘熺悊鍙婂簲鐢

紲炵粡緗戠粶鍘熺悊鍙婂簲鐢
1. 浠涔堟槸紲炵粡緗戠粶錛
紲炵粡緗戠粶鏄涓縐嶆ā鎷熷姩鐗╃炵粡緗戠粶琛屼負鐗瑰緛錛岃繘琛屽垎甯冨紡騫惰屼俊鎮澶勭悊鐨勭畻娉曘傝繖縐嶇綉緇滀緷闈犵郴緇熺殑澶嶆潅紼嬪害錛岄氳繃璋冩暣鍐呴儴澶ч噺鑺傜偣涔嬮棿鐩鎬簰榪炴帴鐨勫叧緋伙紝浠庤岃揪鍒板勭悊淇℃伅鐨勭洰鐨勩
浜虹被鐨勭炵粡緗戠粶

2. 紲炵粡緗戠粶鍩虹鐭ヨ瘑
鏋勬垚錛氬ぇ閲忕畝鍗曠殑鍩虹鍏冧歡鈥斺旂炵粡鍏冪浉浜掕繛鎺
宸ヤ綔鍘熺悊錛氭ā鎷熺敓鐗╃殑紲炵粡澶勭悊淇℃伅鐨勬柟寮
鍔熻兘錛氳繘琛屼俊鎮鐨勫苟琛屽勭悊鍜岄潪綰挎ц漿鍖
鐗圭偣錛氭瘮杈冭交鏉懼湴瀹炵幇闈炵嚎鎬ф槧灝勮繃紼嬶紝鍏鋒湁澶ц勬ā鐨勮$畻鑳藉姏
紲炵粡緗戠粶鐨勬湰璐錛

紲炵粡緗戠粶鐨勬湰璐ㄥ氨鏄鍒╃敤璁$畻鏈鴻璦妯℃嫙浜虹被澶ц剳鍋氬喅瀹氱殑榪囩▼銆
3. 鐢熺墿紲炵粡鍏緇撴瀯

4. 紲炵粡鍏冪粨鏋勬ā鍨

xj涓鴻緭鍏ヤ俊鍙鳳紝胃i涓洪槇鍊礆紝wij琛ㄧず涓庣炵粡鍏冭繛鎺ョ殑鏉冨礆紝yi琛ㄧず杈撳嚭鍊
鍒ゆ柇xjwij鏄鍚﹀ぇ浜庨槇鍊嘉竔
5. 浠涔堟槸闃堝礆紵
涓寸晫鍊箋
紲炵粡緗戠粶鏄妯′豢澶ц剳鐨勭炵粡鍏冿紝褰撳栫晫鍒烘縺杈懼埌涓瀹氱殑闃堝兼椂錛岀炵粡鍏冩墠浼氬彈鍒烘縺錛屽獎鍝嶄笅涓涓紲炵粡鍏冦

6. 鍑犵嶄唬琛ㄦх殑緗戠粶妯″瀷
鍗曞眰鍓嶅悜紲炵粡緗戠粶鈥斺旂嚎鎬х綉緇
闃惰穬緗戠粶
澶氬眰鍓嶅悜紲炵粡緗戠粶錛堝弽鎺ㄥ︿範瑙勫垯鍗BP紲炵粡緗戠粶錛
Elman緗戠粶銆丠opfield緗戠粶銆佸弻鍚戣仈鎯寵板繂緗戠粶銆佽嚜緇勭粐絝炰簤緗戠粶絳夌瓑
7. 紲炵粡緗戠粶鑳藉共浠涔堬紵
榪愮敤榪欎簺緗戠粶妯″瀷鍙瀹炵幇鍑芥暟閫艱繎銆佹暟鎹鑱氱被銆佹ā寮忓垎綾匯佷紭鍖栬$畻絳夊姛鑳姐傚洜姝わ紝紲炵粡緗戠粶騫挎硾搴旂敤浜庝漢宸ユ櫤鑳姐鑷鍔ㄦ帶鍒銆佹満鍣ㄤ漢銆佺粺璁″︾瓑棰嗗煙鐨勪俊鎮澶勭悊涓銆傝櫧鐒剁炵粡緗戠粶鐨勫簲鐢ㄥ緢騫匡紝浣嗘槸鍦ㄥ叿浣撶殑浣跨敤榪囩▼涓鍒板簳搴斿綋閫夋嫨鍝縐嶇綉緇滅粨鏋勬瘮杈冨悎閫傛槸鍊煎緱鑰冭檻鐨勩傝繖灝遍渶瑕佹垜浠瀵瑰悇縐嶇炵粡緗戠粶緇撴瀯鏈変竴涓杈冨叏闈㈢殑璁よ瘑銆
8. 紲炵粡緗戠粶搴旂敤

熱點內容
租用雲伺服器需要專業知識嗎 發布:2024-11-26 05:58:04 瀏覽:560
明日之後榴彈炮武器如何配置 發布:2024-11-26 05:49:59 瀏覽:497
商賽中演算法 發布:2024-11-26 05:48:28 瀏覽:291
校園論壇源碼 發布:2024-11-26 05:42:35 瀏覽:568
民生銀行pin密碼是多少 發布:2024-11-26 05:31:24 瀏覽:775
sql獲取日期部分 發布:2024-11-26 05:25:06 瀏覽:743
怎麼才能把安卓數據轉移到蘋果手機上 發布:2024-11-26 05:14:35 瀏覽:851
手機對比參數配置常看的有哪些 發布:2024-11-26 05:01:23 瀏覽:891
qq默認存儲路徑修改 發布:2024-11-26 04:55:02 瀏覽:710
為什麼吉利配置那麼高 發布:2024-11-26 04:49:20 瀏覽:431