在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 圖結(jié)構(gòu)
hash表
單詞統(tǒng)計(jì)
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊(duì)列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計(jì)算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個(gè)數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回?cái)?shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個(gè)數(shù)統(tǒng)計(jì)

圖結(jié)構(gòu)

圖是數(shù)據(jù)結(jié)構(gòu)里面的重要一章。通過圖,我們可以判斷兩個(gè)點(diǎn)之間是不是具有連通性;通過圖,我們還可以計(jì)算兩個(gè)點(diǎn)之間的最小距離是多少;通過圖,我們還可以根據(jù)不同的要求,尋找不同的合適路徑。當(dāng)然,有的時(shí)候?yàn)榱擞?jì)算的需要,我們還需要從圖中抽象出最小生成樹,這樣在遍歷計(jì)算的時(shí)候就不需要持續(xù)判斷是不是遇到了循環(huán)節(jié)點(diǎn)。當(dāng)然,這所有的一切都是從圖的表示開始的。

1)矩陣表示

矩陣表示可以說是最簡單的表示方法,如果說一個(gè)圖中有5個(gè)點(diǎn),那么我們就可以構(gòu)建一個(gè)5*5的矩陣。如果點(diǎn)和點(diǎn)之間存在連接,那么填上1;反之如果不存在連接,那么可以用0表示,當(dāng)然對角線上面的點(diǎn)是沒有意義的。如下圖所示:

static int graph[5][5] =   
{  
    {0, 1, 0, 1, 1},  
    {1, 0, 1, 0, 1},  
    {0, 1, 0, 1, 0},  
    {1, 0, 1, 0, 1},  
    {1, 1, 0, 1, 0}  
};  

如果點(diǎn)和點(diǎn)之間還是存在方向的,那么它們關(guān)于(x,x)對稱軸就是不對稱的,所以結(jié)果也可能是這樣的:

static int graph[5][5] =   
{  
    {0, 0, 0, 0, 0},  
    {1, 0, 0, 0, 0},  
    {0, 1, 0, 0, 0},  
    {1, 0, 1, 0, 0},  
    {1, 1, 0, 1, 0}  
};  

當(dāng)然,如果點(diǎn)和點(diǎn)之間的關(guān)系存在某種權(quán)重,比如說距離,那我們可以用它來代替原來的數(shù)據(jù)1:

static int graph[5][5] =   
{  
    {0, 0, 0, 0, 0},  
    {3, 0, 0, 0, 0},  
    {0, 6, 0, 0, 0},  
    {8, 0, 4, 0, 0},  
    {9, 2, 0, 7, 0}  
}; 

矩陣表示下的圖結(jié)構(gòu)非常直觀。但是,矩陣有一個(gè)特點(diǎn),就是比較浪費(fèi)空間。因?yàn)槲覀冞@里舉例的頂點(diǎn)比較少,只有5個(gè),但是請大家試想一下,如果一張圖上有10000個(gè)節(jié)點(diǎn),那么1000010000該是多大的一個(gè)空間啊。重要的是,這1000010000上面大多數(shù)點(diǎn)都是0,所以浪費(fèi)的空間是相當(dāng)可觀的。

2)數(shù)組結(jié)構(gòu)

為了改變矩陣?yán)速M(fèi)空間的特點(diǎn),我們可以建立一個(gè)只有頂點(diǎn)和邊組成的數(shù)據(jù)空間。比如說,我們定義一個(gè)這樣的結(jié)構(gòu):

typedef struct _LINE  
{  
    int start;  
    int end;  
    int weight;  
    int isDirection;  
}LINE; 

上面定義的數(shù)據(jù)結(jié)構(gòu)非常簡潔。第1個(gè)為起始頂點(diǎn),第2個(gè)為終點(diǎn),第3個(gè)為權(quán)重,第4個(gè)判斷當(dāng)前邊是否有向。圖中要是有多少邊,我們就要定義多少個(gè)這樣的數(shù)據(jù)。如果把這些邊的數(shù)據(jù)都放在一起構(gòu)成一個(gè)數(shù)組,那么我們就可以用這個(gè)數(shù)組來表示圖的全部信息了。

但是,我們還是覺得有遺憾的地方。這個(gè)數(shù)據(jù)結(jié)構(gòu)過分強(qiáng)調(diào)了邊的意義和重要性,忽略了頂點(diǎn)本身的含義。因?yàn)?,我們在?qiáng)調(diào)邊的時(shí)候,應(yīng)該添加進(jìn)頂點(diǎn)的相關(guān)特性。離開頂點(diǎn)的支持,單純的邊信息是沒有什么含義的。

3)基于頂點(diǎn)鏈表的圖表示

首先,我們定義頂點(diǎn)的基本結(jié)構(gòu):

typedef struct _LINE  
{  
    int end;  
    int weight;  
    struct _LINE* next;  
}LINE;  

typedef struct _VECTEX  
{  
    int start;  
    int number;  
    LINE* neighbor;  
}VECTEX; 

我們用VECTEX記錄頂點(diǎn)的相關(guān)信息,LINE表示節(jié)點(diǎn)的相關(guān)信息。如果LINE是在VECTEX中的變量,那么neighbor表示當(dāng)前所有節(jié)點(diǎn)的起始點(diǎn)都是start點(diǎn)。如果它是PATH中的變量呢,那么next的起始點(diǎn)就是LINE鏈接的前面一個(gè)點(diǎn),不知道我講清楚了沒有?下面就是點(diǎn)與點(diǎn)之間PATH的定義。

typedef struct _PATH  
{  
    int start;  
    int end;  
    int lenth;  
    LINE* next;  
}PATH; 

其中start為起始點(diǎn),end為終結(jié)點(diǎn),next為start鏈接的下一個(gè)點(diǎn),lenth為路徑的總長度,當(dāng)然也可以修改成其他的權(quán)重形式。

注意事項(xiàng):

1)數(shù)組和鏈表是圖結(jié)構(gòu)的基礎(chǔ),朋友們應(yīng)該好好掌握

2)每一種數(shù)據(jù)結(jié)構(gòu)都有自己的應(yīng)用場合,關(guān)鍵是理解其中的思想和方法

3)圖的表示是圖運(yùn)算的基礎(chǔ),掌握它們是我們進(jìn)一步學(xué)習(xí)的基本條件