當前位置:首頁 » 存儲配置 » 圖片的存儲結構

圖片的存儲結構

發布時間: 2022-11-15 17:32:04

⑴ PNG、JPEG、BMP等幾種圖片格式詳解(四)—— GIF

以下部分內容來自 網路 ,還會有一部分是自己的見解,我寫這篇文章的目的是既讓大家可以了解網路上已有的知識,但是不用再去找網路,還有就是可以看到我關於這種圖片格式的深層次的了解,看完這篇,包括我在內,會感覺到即使很小很小的一個知識點,深入以後都是非常深的,底層和深層次原理是我的最愛,這也是我寫博客的初衷和目的。

GIF(Graphics Interchange Format) 的原義是「 圖像 互換格式」,是 CompuServe 公司在 1987年開發的 圖像文件格式 。GIF文件的數據,是一種基於 LZW演算法 的連續色調的無損 壓縮格式 。其 壓縮率 一般在 50% 左右,它不屬於任何應用 程序 。GIF格式可以存多幅彩色圖像,如果把存於一個文件中的多幅 圖像數據 逐幅讀出並顯示到屏幕上,就可構成一種最簡單的動畫。

GIF圖象是基於顏色列表的(存儲的數據是該點的顏色對應於顏色列表的索引值),最多隻支持8位(256色)。GIF文件內部分成許多存儲塊,用來存儲多幅圖象或者是決定圖象表現行為的控制塊,用以實現動畫和互動式應用。GIF文件還通過LZW壓縮演算法壓縮圖象數據來減少圖象尺寸。

GIF格式自1987年由 CompuServe 公司引入後,因其體積小、成像相對清晰,特別適合於初期慢速的 互聯網 ,而大受歡迎。

在早期, GIF 所用的LZW壓縮演算法是Compuserv所開發的一種免費演算法。然而令很多軟體開發商感到意外的是,GIF文件所採用的壓縮演算法忽然成了 Unisys 公司的專利。

據Unisys公司稱,他們已注冊了 LZW演算法 中的W部分。如果要開發生成(或顯示)GIF文件的程序,則需向該公司支付版稅。由此,人們開始尋求一種新技術,以減少開發成本。 PNG ( Portable Network Graphics ,便攜網路圖形)標准就在這個背景下應運而生了。它一方面滿足了市場對更少的法規限制的需要,另一方面也帶來了更少的技術上的限制,如顏色的數量等。

在2003年6月20日,LZW演算法在美國的專利權已到期而失效。在歐洲、日本及加拿大的專利權亦已分別在2004年的6月18日、6月20日和7月7日到期失效。盡管如此,PNG文件格式憑著其技術上的優勢,已然躋身於網路上第三廣泛應用格式。與GIF相關的專利於2006年8月11日過期。

長久以來,iOS一直被吐槽不能用GIF。造成這一局面的主要原因是:

GIF分為靜態GIF和動畫GIF兩種,擴展名為.gif,是一種壓縮 點陣圖 格式,支持透明 背景圖像 ,適用於多種操作系統,「體型」很小,網上很多小動畫都是GIF格式。其實GIF是將多幅圖像保存為一個圖像文件,從而形成動畫,最常見的就是通過一幀幀的動畫串聯起來的搞笑gif圖,所以歸根到底GIF仍然是 圖片文件格式 。
但GIF只能顯示256色。和 jpg格式 一樣,這是一種在網路上非常流行的圖形文件格式。

GIF主要分為兩個版本,即 GIF 89a 和 GIF 87a

此給出的語法用來說明形成gif 數據流 的塊序列,用一些規則列表來表達。下面列出用於gif語法的符號定義。

gif語法的符號定義:<GIF 數據流 > ::= 頭部 <;邏輯視屏> <;數據>* 尾記錄

gif 數據流 中的 數據塊 可以分為三組:控制塊、成象塊和特殊用途塊。

色表- gif格式利用色表來顯示基於光柵的圖像。色表分為全局色表和局部色表。全局色表對於那些沒有設置局部色表的圖像起作用。全局色表的作用域是整個 數據流 。局部色表對於緊接在其後的單張圖像起作用。這兩種色表都是可選的。

全局色表這東西是我們感興趣的東西,它有點像png格式定義種的調色板,如果要修改gif圖片的顏色,哈哈,修改這個全局色表就可以,如果有全局色表塊,那麼它一定從gif流的14個位元組開始(頭部6個 + 邏輯視頻描述塊7個)。

以下是各 數據塊 的說明,如果註明為版本89a的話,則說明這個數據塊不會在87a版的協議中出現。

Packed Fields 說明:

GIF文件內部是按塊劃分的,包括 控制塊( Control Block ) 和 數據塊(DataSub-blocks) 兩種。控制塊是控制數據塊行為的,根據不同的控制塊包含一些不同的控制參數;數據塊只包含一些8-bit的字元流,由它前面的控制塊來決定它的功能,每個數據塊大小從0到255個位元組,數據塊的第一個位元組指出這個數據塊大小(位元組數),計算數據塊的大小時不包括這個位元組,所以一個空的數據塊有一個位元組,那就是數據塊的大小0x00。 下表是一個數據塊的結構:

一個GIF文件的結構可分為文件頭(File Header)、GIF數據流(GIF DataStream)和文件終結器(Trailer)三個部分。文件頭包含GIF文件署名(Signature)和版本號(Version);GIF數據流由控制標識符、圖象塊(ImageBlock)和其他的一些擴展塊組成;文件終結器只有一個值為0x3B的字元('';'')表示文件結束。下表顯示了一個GIF文件的組成結構:

是用來標識GIF署名(Signature)和版本號(Version)的。

GIF署名用來確認一個文件是否是GIF格式的文件,這一部分由三個字元組成:"GIF";文件版本號也是由三個位元組組成,可以為"87a"或"89a"。具體如下圖所示。

它包含了很多的部分。

(1) 邏輯屏幕標識符 (Logical Screen Descriptor) :這一部分由7個位元組組成,定義了GIF圖象的大小 (Logical Screen Width &Height) 、顏色深度 (Color Bits) 、背景色 (Blackground ColorIndex) 以及有無全局顏色列表 (Global Color Table) 和顏色列表的索引數 (IndexCount) ,具體描述見下圖。

也可以參考下圖。

(2)全局顏色列表 (Global Color Table) :

全局顏色列表必須緊跟在邏輯屏幕標識符後面,每個顏色列表索引條目由三個位元組組成,按R、G、B的順序排列。

(3)圖象標識符 (Image Descriptor) :一個GIF文件內可以包含多幅圖象,一幅圖象結束之後緊接著下是一幅圖象的標識符,圖象標識符以0x2C('','')字元開始,定義緊接著它的圖象的性質,包括圖象相對於邏輯屏幕邊界的偏移量、圖象大小以及有無局部顏色列表和顏色列表大小,由10個位元組組成,具體如下所示。

也可以參考下圖。

(4)局部顏色列表 (Local Color Table) :如果上面的局部顏色列表標志置位的話,則需要在這里(緊跟在圖象標識符之後)定義一個局部顏色列表以供緊接著它的圖象使用,注意使用前應線保存原來的顏色列表,使用結束之後回復原來保存的全局顏色列表。如果一個GIF文件即沒有提供全局顏色列表,也沒有提供局部顏色列表,可以自己創建一個顏色列表,或使用系統的顏色列表。局部顏色列表的排列方式和全局顏色列表一樣:RGBRGB......

(5) 基於顏色列表的圖象數據 (Table-Based Image Data) :由兩部分組成: LZW 編碼長度 (LZW Minimum Code Size) 和圖象數據 (Image Data) 。

下面給出總體的存儲結構的原理圖。

PC上製作軟體主要為 Adobe ImageReady 和 fireworks 兩個。
WEB上gif在線製作編輯 gif5.net ,支持 圖片 、視頻、FLASH轉GIF。

我一般使用 LICEcap 製作gif圖。

1. 網路
2. GIF圖片的文件儲存結構和動畫原理
3. GIF圖片原理和儲存結構深入解析

⑵ 視頻,圖片,音頻這些格式的文件在內存中是以什麼數據結構存儲的呢

仍然是二進制的,只是不同於單純的二進制數字。
具體來說就很繁瑣了,

⑶ 圖的三種存儲結構

設圖G有n (n 1) 個頂點,則鄰接矩陣是一個n階方陣。
當矩陣中的 [i,j] !=0(下標從1開始) ,代表其對應的第i個頂點與第j個頂點是連接的。

為圖G中的每一個頂點建立一個單鏈表,每條鏈表的結點元素為與該頂點連接的頂點。

可以看成是有向圖的鄰接表和逆鄰接表結合起來的一種鏈表。

⑷ 關於數據結構中圖的儲存方式的選擇

首先你要明白,鄰接鏈表存圖的空間復雜度與圖中邊的數量有關(O(N+E) E表示圖中邊的數目),而數組存圖空間復雜度與點數有關(O(N^2)N表示點數)
看點的數量,如果點的數量不是很大(比如幾百個左右或者更小)那麼二者都可以選擇。
如果點的數量過大的話,用數組存儲稀疏圖會造成大量的空間浪費,此時選擇使用鄰接表更好。

⑸ 視頻,圖片,音頻這些格式的文件在內存中是以什麼數據結構存儲的呢

有很多的,具體點是:視頻是mv
rm
rvb等等了,圖片是jpg
很多的,音頻是mp3
wmv等等格式了.具體的你得問編這些程序的人了

⑹ 存儲圖用鏈式前向星好還是vector數組

一般來講,圖的常用存儲結構有鄰接矩陣,和鄰接表,但我們知道鄰接矩陣空間浪費太嚴重,鄰接表不好寫,今天來講一下圖的另一隻常用的存儲結構:前向星和鏈式前向星,介於上述兩種存儲結構之間的一種比較均衡的存儲結構。

首先我們來說一下圖的前向星表示方法:
前向星是一種通過存儲邊信息的方式來存儲圖的一種數據結構,他構造簡單,讀入每條邊的信息,將邊存放在數組中,把數組中的邊按照起點順序排列,前向星也就構造完成了。方便查詢,我們用另外一個數組head(i)來存儲起點為vi的第一條邊的位置。
存儲結構:

int head[MAXN];
struct Node
{
int from;//起點
int to;//終點
int w;//權值
};
Node map[MAXN];

比較函數:

bool cmp(const Node &a,const Node &b)
{
if(a.from==b.from)
{
if(a.to==b.to) return a.w<b.w;
else return a.to<b.to;
}
else return a.from<b.from;
}

讀入數據:
cin>>n>>m;
for(i=1;i<=m;i++)
cin>>map[i].from>>map[i].to>>map[i].w;
sort(map+1,map+m+1,cmp);
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++)
if(map[i].from!=map[i-1].from)
head[map[i].from]=i;

遍歷函數:
for(i=1;i<=n;i++)
for(j=head[i];map[j],from==i&&j<=m;j++)
cout<<map[i].from<<map[i].to<<map[i].w<<endl;

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

一、鄰接矩陣存儲方法

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

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

⑻ 數據結構——圖

轉自: http://www.cnblogs.com/mcgrady/archive/2013/09/23/3335847.html

閱讀目錄

一,圖的定義

二,圖相關的概念和術語

三,圖的創建和遍歷

四,最小生成樹和最短路徑

五,演算法實現

這一篇我們要總結的是圖(Graph),圖可能比我們之前學習的線性結構和樹形結構都要復雜,不過沒有關系,我們一點一點地來總結,那麼關於圖我想從以下幾點進行總結:

1,圖的定義?

2,圖相關的概念和術語?

3,圖的創建和遍歷?

4,最小生成樹和最短路徑?

5,演算法實現?

一,圖的定義

什麼是圖呢?

圖是一種復雜的非線性結構。

在線性結構中,數據元素之間滿足唯一的線性關系,每個數據元素(除第一個和最後一個外)只有一個直接前趨和一個直接後繼;

在樹形結構中,數據元素之間有著明顯的層次關系,並且每個數據元素只與上一層中的一個元素(雙親節點)及下一層的多個元素(孩子節點)相關;

而在圖形結構中,節點之間的關系是任意的,圖中任意兩個數據元素之間都有可能相關。

圖G由兩個集合V(頂點Vertex)和E(邊Edge)組成,定義為G=(V,E)

二,圖相關的概念和術語

1,無向圖和有向圖

對於一個圖,若每條邊都是沒有方向的,則稱該圖為無向圖。圖示如下:

因此,(Vi,Vj)和(Vj,Vi)表示的是同一條邊。注意,無向圖是用小括弧,而下面介紹的有向圖是用尖括弧。

無向圖的頂點集和邊集分別表示為:

V(G)={V1,V2,V3,V4,V5}

E(G)={(V1,V2),(V1,V4),(V2,V3),(V2,V5),(V3,V4),(V3,V5),(V4,V5)}

對於一個圖G,若每條邊都是有方向的,則稱該圖為有向圖。圖示如下。

因此,和是兩條不同的有向邊。注意,有向邊又稱為弧。

有向圖的頂點集和邊集分別表示為:

V(G)={V1,V2,V3}

E(G)={,,,}

2,無向完全圖和有向完全圖

我們將具有n(n-1)/2條邊的無向圖稱為無向完全圖。同理,將具有n(n-1)條邊的有向圖稱為有向完全圖。

3,頂點的度

對於無向圖,頂點的度表示以該頂點作為一個端點的邊的數目。比如,圖(a)無向圖中頂點V3的度D(V3)=3

對於有向圖,頂點的度分為入度和出度。入度表示以該頂點為終點的入邊數目,出度是以該頂點為起點的出邊數目,該頂點的度等於其入度和出度之和。比如,頂點V1的入度ID(V1)=1,出度OD(V1)=2,所以D(V1)=ID(V1)+OD(V1)=1+2=3

記住,不管是無向圖還是有向圖,頂點數n,邊數e和頂點的度數有如下關系:

因此,就拿有向圖(b)來舉例,由公式可以得到圖G的邊數e=(D(V1)+D(V2)+D(V3))/2=(3+2+3)/2=4

4,子圖

故名思義,這個就不解釋了。

5,路徑,路徑長度和迴路

路徑,比如在無向圖G中,存在一個頂點序列Vp,Vi1,Vi2,Vi3…,Vim,Vq,使得(Vp,Vi1),(Vi1,Vi2),…,(Vim,Vq)均屬於邊集E(G),則稱頂點Vp到Vq存在一條路徑。

路徑長度,是指一條路徑上經過的邊的數量。

迴路,指一條路徑的起點和終點為同一個頂點。

6,連通圖(無向圖)

連通圖是指圖G中任意兩個頂點Vi和Vj都連通,則稱為連通圖。比如圖(b)就是連通圖。下面是一個非連通圖的例子。

上圖中,因為V5和V6是單獨的,所以是非連通圖。

7,強連通圖(有向圖)

強連通圖是對於有向圖而言的,與無向圖的連通圖類似。

8,網

帶」權值」的連通圖稱為網。如圖所示。

三,圖的創建和遍歷

1,圖的兩種存儲結構

1) 鄰接矩陣,原理就是用兩個數組,一個數組保存頂點集,一個數組保存邊集。下面的演算法實現里邊我們也是採用這種存儲結構。如下圖所示:

2) 鄰接表,鄰接表是圖的一種鏈式存儲結構。這種存儲結構類似於樹的孩子鏈表。對於圖G中每個頂點Vi,把所有鄰接於Vi的頂點Vj鏈成一個單鏈表,這個單鏈表稱為頂點Vi的鄰接表。

2,圖的兩種遍歷方法

1) 深度優先搜索遍歷

深度優先搜索DFS遍歷類似於樹的前序遍歷。其基本思路是:

a) 假設初始狀態是圖中所有頂點都未曾訪問過,則可從圖G中任意一頂點v為初始出發點,首先訪問出發點v,並將其標記為已訪問過。

b) 然後依次從v出發搜索v的每個鄰接點w,若w未曾訪問過,則以w作為新的出發點出發,繼續進行深度優先遍歷,直到圖中所有和v有路徑相通的頂點都被訪問到。

c) 若此時圖中仍有頂點未被訪問,則另選一個未曾訪問的頂點作為起點,重復上述步驟,直到圖中所有頂點都被訪問到為止。

圖示如下:

註:紅色數字代表遍歷的先後順序,所以圖(e)無向圖的深度優先遍歷的頂點訪問序列為:V0,V1,V2,V5,V4,V6,V3,V7,V8

如果採用鄰接矩陣存儲,則時間復雜度為O(n2);當採用鄰接表時時間復雜度為O(n+e)。

2) 廣度優先搜索遍歷

廣度優先搜索遍歷BFS類似於樹的按層次遍歷。其基本思路是:

a) 首先訪問出發點Vi

b) 接著依次訪問Vi的所有未被訪問過的鄰接點Vi1,Vi2,Vi3,…,Vit並均標記為已訪問過。

c) 然後再按照Vi1,Vi2,… ,Vit的次序,訪問每一個頂點的所有未曾訪問過的頂點並均標記為已訪問過,依此類推,直到圖中所有和初始出發點Vi有路徑相通的頂點都被訪問過為止。

圖示如下:

因此,圖(f)採用廣義優先搜索遍歷以V0為出發點的頂點序列為:V0,V1,V3,V4,V2,V6,V8,V5,V7

如果採用鄰接矩陣存儲,則時間復雜度為O(n2),若採用鄰接表,則時間復雜度為O(n+e)。

四,最小生成樹和最短路徑

1,最小生成樹

什麼是最小生成樹呢?在弄清什麼是最小生成樹之前,我們需要弄清什麼是生成樹?

用一句語簡單概括生成樹就是:生成樹是將圖中所有頂點以最少的邊連通的子圖。

比如圖(g)可以同時得到兩個生成樹圖(h)和圖(i)

知道了什麼是生成樹之後,我們就很容易理解什麼是最小生成樹了。所謂最小生成樹,用一句話總結就是:權值和最小的生成樹就是最小生成樹。

比如上圖中的兩個生成樹,生成樹1和生成樹2,生成樹1的權值和為:12,生成樹2的權值為:14,我們可以證明圖(h)生成樹1就是圖(g)的最小生成樹。

那麼如何構造最小生成樹呢?可以使用普里姆演算法。

2,最短路徑

求最短路徑也就是求最短路徑長度。下面是一個帶權值的有向圖,表格中分別列出了頂點V1其它各頂點的最短路徑長度。

表:頂點V1到其它各頂點的最短路徑表

從圖中可以看出,頂點V1到V4的路徑有3條(V1,V2,V4),(V1,V4),(V1,V3,V2,V4),其路徑長度分別為15,20和10,因此,V1到V4的最短路徑為(V1,V3,V2,V4)。

那麼如何求帶權有向圖的最短路徑長度呢?可以使用迪傑斯特拉(Dijkstra)演算法。

⑼ 數據結構 - 圖

前面我們學習了線性表,棧、隊列和樹。前面三者都屬於線性表范疇,它的的數據元素是被串起來的,僅有線性關系,每個元素僅有一個直接前驅和一個直接後繼,是屬於一對一關系。在樹裡面,每個元素之間存在著明顯的層次關系,每一層的元素可能和下一層的多個元素相關,但只能和上一層的一個元素相關,屬於一對多的關系。而圖是一種較線性表和樹更為復雜的數據結構,在圖的結構中,節點和節點的關系是任意的,圖中任意兩個數據元素都可能相關。

定義 :圖( Graph )是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。

在圖中需要注意的是:

(1)線性表中我們把數據元素叫元素,樹中將數據元素叫結點,在圖中數據元素,我們則稱之為頂點(Vertex)。

(2)線性表可以沒有元素,稱為空表;樹中可以沒有節點,稱為空樹;但是,在圖中不允許沒有頂點(有窮非空性)。

(3)線性表中的各元素是線性關系,樹中的各元素是層次關系,而圖中各頂點的關系是用邊來表示(邊集可以為空)。

頂點Vi的度(Degree)是指在圖中與Vi相關聯的邊的條數。對於有向圖來說,有入度(In-degree)和出度(Out-degree)之分,有向圖頂點的度等於該頂點的入度和出度之和。

①若無向圖中的兩個頂點V1和V2存在一條邊(V1,V2),則稱頂點V1和V2鄰接(Adjacent);

②若有向圖中存在一條邊<V3,V2>,則稱頂點V3與頂點V2鄰接,且是V3鄰接到V2或V2鄰接直V3;

注意:無向圖中的邊使用小括弧「()」表示,而有向圖中的邊使用尖括弧「<>」表示。

在無向圖中,若從頂點Vi出發有一組邊可到達頂點Vj,則稱頂點Vi到頂點Vj的頂點序列為從頂點Vi到頂點Vj的路徑(Path)。

若從Vi到Vj有路徑可通,則稱頂點Vi和頂點Vj是連通(Connected)的。

圖的存儲結構除了要存儲圖中的各個頂點本身的信息之外,還要存儲頂點與頂點之間的關系,因此,圖的結構也比較復雜。常用的圖的存儲結構有鄰接矩陣和鄰接表等。

我們再來看一個有向圖樣例,如下圖所示的左邊。頂點數組為vertex[4]={v0,v1,v2,v3},弧數組arc[4][4]為下圖右邊這樣的一個矩陣。主對角線上數值依然為0。但因為是有向圖,所以此矩陣並不對稱,比如由v1到v0有弧,得到arc[1][0]=1,而v到v沒有弧,因此arc[0][1]=0。

註:由於存在n個頂點的圖需要n*n個數組元素進行存儲,當圖為稀疏圖時,使用鄰接矩陣存儲方法將會出現大量0元素,這會造成極大的空間浪費。這時,可以考慮使用鄰接表表示法來存儲圖中的數據。

首先,回憶我們在線性表時談到, 順序存儲結構 就存在預先分配內存可能造成存儲空間浪費的問題,於是引出了 鏈式存儲 的結構。同樣的,我們也可以考慮對邊或弧使用鏈式存儲的方式來避免空間浪費的問題。

鄰接表 由表頭節點和表節點兩部分組成,圖中每個頂點均對應一個存儲在數組中的表頭節點。如果這個表頭節點所對應的頂點存在鄰接節點,則把鄰接節點依次存放於表頭節點所指向的單向鏈表中。

上面的圖G1包含了"A,B,C,D,E,F,G"共7個頂點,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"共7條邊。

上圖右邊的矩陣是G1在內存中的鄰接表示意圖。每一個頂點都包含一條鏈表,該鏈表記錄了"該頂點的鄰接點的序號"。例如,第2個頂點(頂點C)包含的鏈表所包含的節點的數據分別是"0,1,3";而這"0,1,3"分別對應"A,B,D"的序號,"A,B,D"都是C的鄰接點。就是通過這種方式記錄圖的信息的。

鄰接表有向圖是指通過鄰接表表示的有向圖。

上面的圖G2包含了"A,B,C,D,E,F,G"共7個頂點,而且包含了"<A,B>,<B,C>,<B,E>,<B,F>,<C,E>,<D,C>,<E,B>,<E,D>,<F,G>"共9條邊。

上圖右邊的矩陣是G2在內存中的鄰接表示意圖。每一個頂點都包含一條鏈表,該鏈表記錄了"該頂點所對應的出邊的另一個頂點的序號"。例如,第1個頂點(頂點B)包含的鏈表所包含的節點的數據分別是"2,4,5";而這"2,4,5"分別對應"C,E,F"的序號,"C,E,F"都屬於B的出邊的另一個頂點。

⑽ 數字圖像的存儲格式

遙感數據以磁帶、光碟等為存儲介質,由一個或多個文件組成,每個文件又以若干個記錄組成。記錄是作為一個單位來處理的一組相連的數據,分為物理記錄和邏輯記錄; 文件是由若干個邏輯記錄構成的在目的、形式和內容上彼此相似的信息項的集合。邏輯記錄的排列方式決定了文件的結構方式,加之不同的輔助說明信息而構成了不同的遙感數據格式。對於遙感數字圖像而言,它必須以一定的格式存儲,才能有效地進行分發和利用。

多波段圖像具有空間的位置和光譜的信息。多波段圖像的數據格式根據在二維空間的像元配置中如何存儲各種波段的信息可分為四類。

1. BSQ,BIL,BIP 格式

BSQ ( Band Sequential) 格式,又稱為波段序貫格式,在一個遙感數據文件內各像元DN 值相當於以 「波段」 為主要關鍵字、以 「行」 為次要關鍵字、以 「列」 ( 像元號) 為第三關鍵字對像元 DN 值進行排序存放。

BIL ( Band Interleaved by Line) 格式,又稱為波段行交叉格式,在一個遙感數據文件內各像元 DN 值相當於以 「行」為主要關鍵字、以 「波段」為次要關鍵字、以 「列」( 像元號) 為第三關鍵字對像元 DN 值進行排序存放。

BIP ( Band Interleaved by Pixels) 格式,又稱為波段像元交叉格式,在一個遙感數據文件內各像元 DN 值相當於以 「行」為主要關鍵字、以 「列」 ( 像元號) 為次要關鍵字、以 「波段」為第三關鍵字對像元 DN 值進行排序存放。

上述遙感數據基本格式具有不同的特點和適用范圍。BSQ 格式最適合於對單個波段的整個或部分圖像空間區域進行存儲和讀取等處理操作,如圖像對比度增強、平滑、銳化等; BIP 格式為圖像數據單個像元波譜特性的存儲與讀取提供最佳性能,如在最大似然比分類法、波段之間的加減乘除代數運算等亦宜採用該格式; BIL 方式具有以上兩種方式的中間特徵,提供了圖像空間和像元波譜處理之間的一種折中的方式,適用於以行 ( 圖像掃描行) 為單位的處理操作,如水平方向的線性影像特徵增強處理等。

2. Fast - L7A 格式

該格式是美國 EDC 在沿用了以往 Landsat 數據產品快速格式的基礎上而選用的記錄Landsat-7 / ETM + 數據的格式之一。Fast - L7A 格式的數據由 3 個頭文件及 8 個數據文件組成,3 個頭文件對應 Landsat-7 數據的三個波段組: 全色波段組、可見光及近紅外波段組、熱紅外波段組; 8 個數據文件對應 Landsat-7 數據的 8 個波段。

3 個頭文件中,每個頭文件包含 3 個 1536 位元組的記錄,分別是管理記錄、輻射記錄和幾何記錄,它們記錄了產品標識信息、圖像標識信息、輻射校正系數、地圖投影、地球模型、太陽高度角和方位角等圖像數據輔助信息。8 個數據文件中,每個文件僅含一個波段的數據而不含頭尾記錄,圖像數據按行順序排列,並以 8 bit 無符號整數表示。

3. GeoTIFF 格式

GeoTIFF 是包含地理信息的一種 TIFF 格式的文件。GeoTIFF 格式的數據由 1 個頭文件及相應的數據文件組成。其頭文件與 Fast - L7A 頭文件相似,8 個數據文件分別對應於Landsat-7 數據的 8 個波段數據。

4. HDF 格式

HDF ( Hierarchical Data Format,層次數據格式) 是由美國伊利諾伊大學 ( the Univer-sity of Illinois) 的國家超級計算應用中心 ( The National Center for Supercomputing Applica-tions,NCSA) 於 1987 年研製開發的一種軟體和函數庫,它使用 C 語言和 Fortran 語言編寫,是一種超文本文件格式,能夠存儲不同種類的科學數據,包括圖像、多維數組、指針及文本數據。HDF 格式還提供命令方式,分析現存 HDF 文件的結構,並即時顯示圖像內容。科學家可以用這種標准數據格式快速熟悉文件結構,擺脫不同數據格式之間相互轉換的繁瑣,而將更多的時間和精力用於數據管理和分析。目前,在國外各種衛星感測器上,已經廣泛使用了這種標准數據格式,如 Landsat-7,EOS - TERRA,EOS - AQUA 等。

在物理存儲結構上,一個 HDF 文件包括一個文件頭 ( File Header) ,一個或多個描述塊 ( Data Descriptor Block) ,若干個數據對象 ( Data Object) 。文件頭位於 HDF 文件的頭四個位元組,其內容為四個控制字元的 ASCII 碼值,四個控制字元為 N,C,S,A,可用於判斷一個文件是否為 HDF 文件格式。數據對象是 HDF 文件最基本的存儲元素,包括一個描述符和一個對應的數據元素。描述符長度為 12 個位元組,主要用來描述這個數據元素的數據類型、位置偏移量、數據元素位元組數。在實際的 HDF 文件中,描述符並不是和它對應的數據元素連在一起,而是把相關的許多描述符放在一起而構成一個描述塊,在這個塊的後面順序存儲了各個描述符所對應的數據元素。數據元素是數據對象中的裸數據部分,也就是數據本身,可以是字元、整數、浮點數、數組等。

1993 年美國航空航天局 ( NASA) 把 HDF 格式作為存儲和發布 EOS ( Earth Observa-tion System,對地觀測系統) 數據的標准格式,此後又在 HDF 標準的基礎上共同開發了一種專門化的 HDF 格式———HDF - EOS,專門用於處理各種 EOS 產品。HDF - EOS 使用標準的 HDF 數據類型定義了點、條帶、網格這三種特殊數據類型,並且引入了元數據( Metadata) ,簡化了空間數據的訪問過程,提高了科學研究和用戶對 EOS 數據的訪問速度。

遙感技術被應用以來,遙感數據採用過很多格式,以 Landsat-7 衛星的數據產品為例,該數據產品由美國地球觀測系統數據中心 ( EDC) 提供,按照產品處理級別可分為 三類,即 Level 0R,Level 1R 和 Level 1G。三種產品的定義如下 :

Level 0R: 未經輻射校正和系統級幾何校正的數據產品。

Level 1R: 經過輻射校正但未經系統級幾何校正的數據產品。

Level 1G: 經過輻射校正和系統級幾何校正的數據產品。

EDC 的各類產品所採用的數據格式共有三種,分別是 HDF,Fast - L7A 和 GeoTIFF,產品類型和數據格式之間的對應關系見表 4-1。

表 4-1 Landsat-7 數據產品類型及數據格式

在遙感數據中,除圖像信息以外還附帶有各種注記信息。這是提供數據結構在進行數據分發時,對存儲方式用注記信息的形式來說明所提供的格式。以往曾使用多種格式,但從 1982 年起逐漸以世界標准格式的形式進行分發。因為這種格式是由 Landsat TechnicalWorking Group 確定的,所以也稱 LTWG 格式。世界標准格式具有超結構 ( Super Struc-ture) 的構造,在它的描述符、文件指針、文件說明符的三種記錄中記有數據的記錄方法。其圖像數據部分為 BSQ 方式或 BIL 方式。

熱點內容
編譯原理實驗分析子程序 發布:2025-07-16 19:28:06 瀏覽:457
長江存儲宿舍有wifi嗎 發布:2025-07-16 19:20:45 瀏覽:869
sqlservertrigger 發布:2025-07-16 19:08:19 瀏覽:397
android中權重 發布:2025-07-16 19:07:26 瀏覽:419
lol界面在哪個文件夾 發布:2025-07-16 19:01:53 瀏覽:936
php文件解壓 發布:2025-07-16 19:01:08 瀏覽:883
日誌中心伺服器怎樣搭建 發布:2025-07-16 19:00:27 瀏覽:603
硬碟加密保護 發布:2025-07-16 18:58:52 瀏覽:39
c語言噴人 發布:2025-07-16 18:57:56 瀏覽:351
主機伺服器與雲伺服器哪個比較好 發布:2025-07-16 18:52:02 瀏覽:339