一步一步寫演算法(之圖的儲存)

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱: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;

    有了上面的資料結構,那麼從外層載入資料就是一個逆向操作而已,不再複雜了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.