【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
前面的幾篇部落格,我們對圖進行基本定義,同時介紹了圖的建立、圖的添加和刪除等。今天,我們聊一聊圖是怎麼在儲存在外設中的。這些外接裝置可以是各種類型的,比如說,可以是硬碟、sd卡、網路硬碟等等。本質上說,我們今天討論的主題就是怎麼把圖的資料永久地保留在本地。並且,如果需要載入這些資料,也可以快速恢複圖原來的面貌。對圖資料結構已經記得不太清楚的朋友可以複習一下面的代碼,回想一下我們之前的定義方法。
typedef struct _LINE{int end;int weight;struct _LINE* next;}LINE;typedef struct _VECTEX{int start;int number;LINE* neighbor;struct _VECTEX* next;}VECTEX;typedef struct _GRAPH{int count;VECTEX* head;}GRAPH;
資料結構中有好多的指標。那麼在外存中應該怎麼儲存呢?因為對於外存來說,指標是沒有什麼意義的。大家稍微思考其實就明白了。其實我們可以把這些指標全部看成是位移值。GRAPH是有許多的點構成的,點的結構中有很多的邊串連,那麼我們就可以按照下面的順序儲存資料。
/** ---------------------------------------------------------------------------* | GRAPH | vectex1 | vectex2 | ...... | vectex n | LINE1 |......| LINE n |* ---------------------------------------------------------------------------*/
那麼位移值怎麼安排呢?
a)GRAPH結構
head為第一個vectex的位移地址。
b)VECTEX結構
neighbour記錄了第一條邊的位移位置,next記錄了下一個節點的位移值。
c)LINE結構
next為下一條邊的位移值。
但是,如果我們做一些最佳化的話,那麼儲存的資料還要少一些。比如說,第一個vectex的節點就在GRAPH的後面,那麼head實際上不需要儲存;同時在vectex結構中,因為我們需要知道LINE的位移值,所以neighbour的位移是需要知道的,但是next就不再需要了,因為vectex資料本身就是並列在一起的;最後同樣因為我們需要把所有屬於同一個vectex的邊放在一起,那麼LINE結構中的next資料其實也可以省略了。所以修改後儲存的資料結構大體應該是這樣的:
typedef struct _LINE{int end;int weight;}LINE;typedef struct _VECTEX{int start;int number;LINE* neighbor;}VECTEX;typedef struct _GRAPH{int count;}GRAPH;
有了上面的資料結構,那麼從外層載入資料就是一個逆向操作而已,不再複雜了。