當前位置:首頁 » 服務存儲 » 概述圖的存儲結構
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

概述圖的存儲結構

發布時間: 2022-05-27 18:06:33

A. 簡述計算機三級存儲體系結構

在計算機系統中存儲層次可分為高速緩沖存儲器、主存儲器、輔助存儲器三級。高速緩沖存儲器用來改善主存儲器與中央處理器的速度匹配問題。輔助存儲器用於擴大存儲空間。

1、高速緩沖存儲器

存在於主存與CPU之間的一級存儲器, 由靜態存儲晶元(SRAM)組成,容量比較小但速度比主存高得多, 接近於CPU的速度。在計算機存儲系統的層次結構中,是介於中央處理器和主存儲器之間的高速小容量存儲器。它和主存儲器一起構成一級的存儲器。高速緩沖存儲器和主存儲器之間信息的調度和傳送是由硬體自動進行的。

2、主存儲器(Main memory)

計算機硬體的一個重要部件,其作用是存放指令和數據,並能由中央處理器(CPU)直接隨機存取。現代計算機是為了提高性能,又能兼顧合理的造價,往往採用多級存儲體系。即由存儲容量小,存取速度高的高速緩沖存儲器,存儲容量和存取速度適中的主存儲器是必不可少的。

主存儲器是按地址存放信息的,存取速度一般與地址無關。32位(比特)的地址最大能表達4GB的存儲器地址。這對多數應用已經足夠,但對於某些特大運算量的應用和特大型資料庫已顯得不夠,從而對64位結構提出需求。

3、外儲存器

輔助存儲器又稱外存儲器(簡稱外存)。指除計算機內存及CPU緩存以外的儲存器,此類儲存器一般斷電後仍然能保存數據。常見的外存儲器有硬碟、軟盤、光碟、U盤等。

(1)概述圖的存儲結構擴展閱讀

計算機的主存儲器不能同時滿足存取速度快、存儲容量大和成本低的要求,在計算機中必須有速度由慢到快、容量由大到小的多級層次存儲器,以最優的控制調度演算法和合理的成本,構成具有性能可接受的存儲系統。存儲系統的性能在計算機中的地位日趨重要,主要原因是:

1、馮諾伊曼體系結構是建築在存儲程序概念的基礎上,訪存操作約佔中央處理器(CPU)時間的70%左右。

2、存儲管理與組織的好壞影響到整機效率。

3、現代的信息處理,如圖像處理、資料庫、知識庫、語音識別、多媒體等對存儲系統的要求很高。

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

一、鄰接矩陣存儲方法

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

設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為圖的邊數。

C. 圖的存儲結構有哪些

最常見的:
順序查找:適合順序結構和鏈式結構
二分查找:適合順序結構

其他的二叉查找樹、B-樹之類有自己的數據結構

D. 圖有哪些常見的存儲結構

本文將介紹圖的常見存儲結構及各自的優缺點

鄰接矩陣
鄰接表
十字鏈表
鄰接多重表
邊集數組
鄰接矩陣

E. 1. 簡述存儲系統層次結構的基本思想

制約計算機存儲器設計的問題歸納起來有三個:容量多大?速度多快?價格多貴?
容量多大的問題似乎沒有限制,不管容量多大,總要開發出應用來使用它。速度多快的問題在某種意義上更容易回答。為了獲得多大的性能,存儲器速度必須能夠跟上處理器的速度,即當處理器執行指令時,我們不想使它停下來等待指令或操作數。最後一個問題也必須考慮,對於實用的系統,存儲器的價格相對於其他部件必須是合理的。
正如人們所預料的,在存儲器的3個關鍵特性即價格、容量和存取時間之間需要進行權衡。任何時候,都有各種技術可用來實現存儲系統。在這個技術領域中,存在如下關系:
存取時間越短,每位的價格就越高;
容量越大,每位的價格就越低;
容量越大,存取時間就越長;
很顯然,擺在設計者面前的難題是,不僅需要大容量,而且需要低的每位價格,因此希望採用提供大容量存儲器的技術。但為了滿足性能需求,設計者又必須使用昂貴、容量較小和存取時間快的存儲器。
解決這個難題的方法是採用存儲器層次結構,而不只是依賴單一的存儲部件或技術。下圖給出了一個通用存儲層次結構,圖中從上到下,出現下列情況:
每位價格降低;
容量增大;
存取時間增大;
處理器訪問存儲器的頻度降低;
因此,容量較小、價格較貴、速度較快的存儲器可作為容量較大、速度較慢的存儲器的補充。這種組織方式成功的關鍵是最後一項,即處理器訪問存儲器的頻度降低。
條件四有效的基礎是訪問局部性原理。在程序執行的過程中,處理器訪問存儲器中的指令和數據傾向於成簇(塊)。程序通常通常包含很多迭代循環和子程序,一旦進入了一個循環和子程序,則需重復訪問一小組指令。同樣,對於表和數組的操作,包含存取一簇簇的數據。在一長段時間內,使用的簇是變動的;而在一小段時間內,處理器主要訪問存儲器中的固定簇。
因此,通過分層結構組織數據,有可能使存取較低層的百分比低於存取高層存儲器的百分比。考慮剛才給出的二級存儲器的例子,讓第二級的存儲器包含所有程序的指令和數據,當前的簇臨時放在第一級,第一級的某些簇會不時地交換回第二級,為將要進入第一級的簇騰出空間。然而,平均來說,多數的訪問是對第一級中的指令和數據。
這個原則可以應用到二級以上的存儲器。考察圖所示的分層結構,速度較快、容量較小且價格最貴的存儲器是處理器的內部寄存器。下跳兩層是主存儲器,它是計算機中主要的內存系統。主存儲器常用速度更快,容量更小的高速緩存來擴充。
(很多體系結構或組成原理相關的書籍上都有的。回答比較粗糙,建議你參考William Stalling的計算機組織與體系結構,這本書上有對該問題的完整的論述。)

F. 圖的兩種存儲結構是什麼

二樓說錯了,方向有誤。
這兩個分別叫剖面符號和斷面符號,他們剖段的方向都是縱向的,觀察的方向是指向數字的方向,從網頁上來看,就是L1是從左往右,而1┃則表示從右往左看。

這兩種符號的區別是斷面圖與剖面圖的區別在於:
斷面圖只畫形體被剖開後斷面的投影,而剖面圖要畫出形體被剖開後整個餘下部分的投影如圖。

1)剖面圖是形體剖切之後剩下部分的投影,是體的投影。斷面圖是形體剖切之後斷面的投影,是面的投影。 剖面圖中包含斷面圖。

2)剖面圖用剖切位置線、投射方向線和編號來表示。斷面圖則只畫剖切位置線與編號,用編號的注寫位置來代表投射方向。

3)剖面圖可用兩個或兩個以上的剖切平面進行剖切,斷面圖的剖切平面通常只能是單一的。

G. 有關圖的存儲結構

(1)順序存儲方法
該方法把邏輯上相鄰的結點存儲在物理位置上相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接關系來體現。
由此得到的存儲表示稱為順序存儲結構 (Sequential Storage Structure),通常藉助程序語言的數組描述。
該方法主要應用於線性的數據結構。非線性的數據結構也可通過某種線性化的方法實現順序存儲。 (2)鏈接存儲方法
該方法不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關系由附加的指針欄位表示。由此得到的存儲表示稱為鏈式存儲結構(Linked Storage Structure),通常藉助於程序語言的指針類型描述。

H. 圖的存儲結構是什麼

由於圖的結構比較復雜,任意兩個頂點之間都可能存在關系(邊),無法通過存儲位置表示這種任意的邏輯關系,所以,圖無法採用順序存儲結構。這一點同其他數據結構(如線性表、樹)不同。考慮圖的定義,圖是由頂點和邊組成的,所以,分別考慮如何存儲頂點和邊。圖常用的存儲結構有鄰接矩陣、鄰接表、十字鏈表和鄰接多重表。

I. 圖的存儲結構

鄰接矩陣:
有向圖的鄰接矩陣
具有n個頂點的有向圖可以用一個n′n的方形矩陣表示。假設該矩陣的名稱為M,則當<vi,vj>是該有向圖中的一條弧時,M[i,j]=1;否則M[i,j]=0。第i個頂點的出度為矩陣中第i行中"1"的個數;入度為第i列中"1"的個數,並且有向圖弧的條數等於矩陣中"1"的個數。
無向圖的鄰接矩陣
具有n個頂點的無向圖也可以用一個n′n的方形矩陣表示。假設該矩陣的名稱為M,則當(vi,vj)是該無向圖中的一條邊時,M[i,j]=M[j,i]=1;否則,M[i,j]=M[j,j]=0。第i個頂點的度為矩陣中第i 行中"1"的個數或第i列中"1"的個數。圖中邊的數目等於矩陣中"1"的個數的一半,這是因為每條邊在矩陣中描述了兩次。
在C 語言中,實現鄰接矩陣表示法的類型定義如下所示: #defineMAX_VERTEX_NUM20typedefstructgraph{Elemtypeelem[MAX_VERTEX_NUM][MAX_VERTEX_NUM];intn;}Graph;鄰接表
邊結點的結構為:
adjvex是該邊或弧依附的頂點在數組中的下標,next是指向下一條邊或弧結點的指針
elem是頂點內容,firstedge是指向第一條邊或弧結點的指針。
在C語言中,實現鄰接表表示法的類型定義如下所示: #defineMAX_VERTEX_NUM30//最大頂點個數typestructEdgeLinklist{//邊結點intadjvex;structEdgeLinklist*next;}EdgeLinklist;typedefstructVexLinklist{//頂點結點Elemtypeelem;EdgeLinklist*firstedge;}VexLinklist,AdjList[MAX_VERTEX_NUM];創建有向圖和無向圖鄰接表的演算法實現:
(1) 創建有向圖鄰接表 voidCreate_adj(AdjListadj,intn){for(i=0;i<n;i++){//初始化頂點數組scanf(&adj.elem);adj.firstedge=NULL;}scanf(&i,&j);//輸入弧while(i){s=(EdgeLinklist*)malloc(sizeof(EdgeLinklist));//創建新的弧結點s->adgvex=j-1;s->next=adj[i-1].firstedge;//將新的弧結點插入到相應的位置adj[i-1].firstegde=s;scanf(&i,&j);//輸入下一條弧}}(2)創建無向圖的鄰接表 voidCreate_adj(AdjListadj,intn){for(i=0;i<n;i++){//初始化鄰接表scanf(&adj.elem);adj.firstedge=NULL;}scanf(&i,&j);//輸入邊while(i){s1=(EdgeLinklist*)malloc(sizeof(EdgeLinklist));s1->adgvex=j-1;s2=(EdgeLinklist*)malloc(sizeof(EdgeLinklist));s2->adgvex=i-1;s1->next=adj[i-1].firstedge;adj[i-1].firstegde=s1;s2->next=adj[j-1].firstedge;adj[j-1].firstegde=s2;scanf(&i,&j);}}

J. 存儲結構的概念

存儲結構的概念
數據元素之間的關系有兩種不同的表示方法:順序映象和非順序映象,並由此得到兩種不同的存儲結構:順序存儲結構和鏈式存儲結構。

數據的存儲結構是指數據的邏輯結構在計算機中的表示。

數據儲存結構
分類
順序存儲方法它是把邏輯上相鄰的結點存儲在物理位置相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接關系來體現,由此得到的存儲表示稱為順序存儲結構。順序存儲結構是一種最基本的存儲表示方法,通常藉助於程序設計語言中的數組來實現。

鏈接存儲方法它不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關系是由附加的指針欄位表示的。由此得到的存儲表示稱為鏈式存儲結構,鏈式存儲結構通常藉助於程序設計語言中的指針類型來實現。

存儲和鏈接存儲的基本原理
順序存儲和鏈接存儲是數據的兩種最基本的存儲結構。

在順序存儲中,每個存儲空間含有所存元素本身的信息,元素之間的邏輯關系是通過數組下標位置簡單計算出來的線性表的順序存儲,若一個元素存儲在對應數組中的下標位置為i,則它的前驅元素在對應數組中的下標位置為i-1,它的後繼元素在對應數組中的下標位置為i+1。在鏈式存儲結構中,存儲結點不僅含有所存元素本身的信息,而且含有元素之間邏輯關系的信息。

數據的鏈式存儲結構可用鏈接表來表示

其中data表示值域,用來存儲節點的數值部分。Pl,p2,…,Pill(1n≥1)均為指針域,每個指針域為其對應的後繼元素或前驅元素所在結點(以後簡稱為後繼結點或前驅結點)的存儲位置。通過結點的指針域(又稱為鏈域)可以訪問到對應的後繼結點或前驅結點,若一個結點中的某個指針域不需要指向其他結點,則令它的值為空(NULL)。

在數據的順序存儲中,由於每個元素的存儲位置都可以通過簡單計算得到,所以訪問元素的時間都相同;而在數據的鏈接存儲中,由於每個元素的存儲位置保存在它的前驅或後繼結點中,所以只有當訪問到其前驅結點或後繼結點後才能夠按指針訪問到,訪問任一元素的時間與該元素結點在鏈式存儲結構中的位置有關。