1. 程式人生 > 其它 >重新學習Android——(四)ViewModel

重新學習Android——(四)ViewModel

圖的定義和術語

  • 圖的定義:是一種較線性表和樹更為複雜的資料結構。圖形結構中,結點之間的關係可以是任意的,圖中任意兩個資料元素之間都可能相關。
  • 圖的術語
    • 基礎定義:在圖中的資料元素一般被稱為頂點(Vertex),V是頂點的有窮非空集合;VR是兩個頂點之間的關係的集合;若<v,w>屬於VR,則<v,w>表示從v到w的一條弧(Arc),且稱v為弧尾(Tail)初始點,w為弧頭終端點,此時的圖稱為有向圖.若<v,w>屬於VR必有<w,v>屬於VR,即VR是對稱的,則以無序對(v,w)代替這兩個有序對,表示v和w之間的一條邊(Edge),此時的圖稱為無向圖
      .
    • 完全圖:具有[n(n-1)]/2條邊的無向圖稱為完全圖.
    • 有向完全圖:具有[n(n-1)]/2條弧的有向圖.
    • 有很少條邊或弧(e<nlog2n )的圖稱為稀疏圖,反之稱為稠密圖.
    • :頂點v的是和頂點v相關聯的邊的數目,記為TD(V).以頂點v為頭的弧的數目稱為v的入度,以頂點v為尾的弧的數目稱為v的出度.
    • 路徑:從v到v'的路徑是一個頂點序列,路徑的長度是路徑上的邊或弧的數目.
    • 迴路或環:第一個頂點和最後一個頂點相同的路徑稱為迴路或環.
    • 簡單迴路:序列中頂點不重複出現的迴路,稱為簡單迴路簡單環.
    • 連通圖:若從頂點v到v'有路徑,則稱v和v'是連通的,對於圖中任意兩個頂點都是連通的,則稱圖是連通圖
      .連通分量是指無向圖中的極大連通子圖.
    • 強連通圖:有向圖中,對於每一對頂點都有從v到v'的路徑和從v'到v的路徑,則稱G是強連通圖.有向圖中的極大強連通子圖稱作有向圖的強連通分量
    • 生成樹:是一個極小連通子圖.
    • 生成森林:由若干棵有向樹組成,含有圖中全部頂點,但只有足以構成若干棵不相交的有向樹的弧.
    • :與圖和邊相關的數叫做.

圖的儲存結構

陣列表示法

用兩個陣列分別儲存資料元素的資訊和資料元素之間的關係的資訊

//-----圖的鄰接矩陣儲存表示-----
#define Maxint 32767
#define MVNum 100 
typedef char VerTexType;
typedef int ArcType;
typedef struct{ 
    VerTexType vexs[MVNum] ;//頂點向量
	ArcType arcs[MVNum] [MVNum]; //鄰接矩陣
	int vexnum,arcnum; //圖的當前頂點數和圖數.
}AMGraph;

鄰接表

鄰接表是圖的一種鏈式儲存結構.在鄰接表中,對圖中的每個頂點建立一個單鏈表,第i個單鏈表中的結點表示依附於頂點vi的邊(對有向圖是以頂點v1為尾的弧).每個結點由3個域組成,其中鄰接點域(adjvex)指示與頂點vi鄰接的點在圖中的位置,鏈域(nextarc)指示下一條邊或弧的結點;資料域(info)儲存和邊或弧相關的資訊,如權值等.每個連結串列上附設一個表頭結點.在表頭結點中,除了設有鏈域指向連結串列中第一個結點之外,還設有儲存頂點vi的名或其他有關資訊的資料域(data).

//- - - --圖的鄰接表儲存表示- ----
#define MVNum 100 //最大頂點數
typedef struct ArcNode{ //邊結點
    int  adjvex; 
    struct ArcNode *  nextarc;
    Otherinfo info; 
}ArcNode;
typedef struct VNode {
    VerTexType data; 
    ArcNode *firstarc; 
} VNode,AdjList[MVNum]; 
typedef struct {
    AdjList vertices; 
    int vexnum,arcnum; 
}ALGraph;

十字連結串列

十字連結串列(OrthogonalList)是有向圖的另一種鏈式儲存結構。可以看成是將有向圖的鄰接表和逆鄰接表結合起來得到的一種連結串列。在十字連結串列中,對應千有向圖中每一條弧有一個結點,對應千每個頂點也有一個結點。

//- -- - -有向圖的十字連結串列儲存表示- ----
#define MAX_ VERTEX_NUM 20 
typedef strut ArcBox {
    int  tailvext,headvex; //該弧的尾和頭頂點的位置
    struct ArcBox *hlink, *tlink; //分別為弧頭相同和弧尾相同的弧的
    InfoType *info; //該弧相關資訊的指標
}ArcBox; 
typedef struct VexNode {
    VertexType data;
    ArcBox *firstin,*firstout; 
}VexNode; 
typedef struct{ //分別指向該頂點第一條人弧和出弧
    VexNode xlist [MAX_VERTEX_NUM];//表頭向扯
    int  vexnnm, arcnum; //有向圖的當前頂點數和弧數
}OLGraph; 

鄰接多重表

鄰接多重表(Adjacency Multilist)是無向圖的另一種鏈式儲存結構。雖然鄰接表是無向圖的一種很有效的儲存結構,在鄰接表中容易求得頂點和邊的各種資訊。但是,在鄰接表中每一條邊(V;, Vj)有兩個結點,分別在第i個和第丿個連結串列中,這給某些圖的操作帶來不便。例如在某些圖的應用問題中需要對邊進行某種操作,如對已被搜尋過的邊作記號或刪除一條邊等,此時需要找到表示同一條邊的兩個結點。因此,在進行這一類操作的無向圖的問題中採用鄰接多重表作儲存結構更為適宜。

//- - - --無向圖的鄰接多重表儲存表示-----
#define MAX_VERTEX_NUM 20
typedef enum{unvisited,visited} Visitlf;
typedef struct EBox{
    Visitlf mark; 
    int ivex, jvex; 
    struct EBox *ilink, *jlink; 
    InfoType *info; 
} Ebox; 
typedef struct VexBox{
    VertexType data;
    EBox *firstedge;
}VexBox;
typedef struct{ 
    VexBox adjmulist [MAX_VERTEX_NUM];
    int vexnum, edgenum; 
}AMLGraph;