邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)(物理結(jié)構(gòu))詳解
數(shù)據(jù)結(jié)構(gòu)教我們有效地存儲(chǔ)數(shù)據(jù),既要存儲(chǔ)數(shù)據(jù)本身,還要存儲(chǔ)數(shù)據(jù)之間的關(guān)系。
存儲(chǔ)數(shù)據(jù)本身,也就是將數(shù)據(jù)存儲(chǔ)到內(nèi)存里。數(shù)據(jù)在內(nèi)存中的存儲(chǔ)狀態(tài),就稱為數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu),也叫物理結(jié)構(gòu)。
數(shù)據(jù)結(jié)構(gòu)中,將數(shù)據(jù)之間的關(guān)系稱為數(shù)據(jù)的邏輯結(jié)構(gòu)。以下圖所示的家譜圖為例,數(shù)據(jù)之間存在很多關(guān)系,比如張亮是張平的父輩、是張靜的祖輩等,所有這些關(guān)系就構(gòu)成了數(shù)據(jù)的邏輯結(jié)構(gòu)。

數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)
在內(nèi)存中,數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)無非有以下兩種情況:
1) 集中存儲(chǔ):所有數(shù)據(jù)存儲(chǔ)在一整塊內(nèi)存空間中,數(shù)據(jù)之間緊挨著存放,如下圖所示:

2) 分散存儲(chǔ):各個(gè)數(shù)據(jù)隨機(jī)存儲(chǔ)在內(nèi)存空間中,如下圖所示:

兩種存儲(chǔ)結(jié)構(gòu)各有優(yōu)勢,將數(shù)據(jù)集中存儲(chǔ),方便后續(xù)查找數(shù)據(jù);將數(shù)據(jù)分散存儲(chǔ),方便后續(xù)增加或者刪除數(shù)據(jù)。
數(shù)據(jù)結(jié)構(gòu)中,用順序存儲(chǔ)結(jié)構(gòu)(順序表)實(shí)現(xiàn)數(shù)據(jù)的集中存儲(chǔ),用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)(鏈表)實(shí)現(xiàn)數(shù)據(jù)的分散存儲(chǔ)。有關(guān)這兩種存儲(chǔ)結(jié)構(gòu),我們會(huì)在后續(xù)章節(jié)中做詳細(xì)講解。
數(shù)據(jù)的邏輯結(jié)構(gòu)
數(shù)據(jù)之間可能存在的關(guān)系,有以下 4 種情況:
1) 無關(guān)系

所謂“無關(guān)系”,即數(shù)據(jù)之間不存在任何關(guān)系。例如上圖中,{1,2,3,4} 中各個(gè)數(shù)據(jù)之間就沒有任何關(guān)系。
2) 一對(duì)一

上圖的數(shù)據(jù)集中,每個(gè)數(shù)據(jù)的左側(cè)有且僅有一個(gè)數(shù)據(jù)與其相鄰(除 1 外);同樣,每個(gè)數(shù)據(jù)的右側(cè)也只有一個(gè)數(shù)據(jù)與其相鄰(除 n 外),所有的數(shù)據(jù)都是如此,數(shù)據(jù)之間就是“一對(duì)一”的邏輯結(jié)構(gòu);
3) 一對(duì)多
圖 1 所示的“家譜圖”中,數(shù)據(jù)之間就是“一對(duì)多”的邏輯結(jié)構(gòu)。
以“張平”為例,他的父輩是“張亮”;他有兩個(gè)孩子,分別是“張晶”和“張磊”?!皬埰健焙推渌鼣?shù)據(jù)之間就是“一對(duì)多”的關(guān)系,整個(gè)數(shù)據(jù)集呈現(xiàn)“一對(duì)多”的邏輯結(jié)構(gòu)。
4) 多對(duì)多

{V1,V2,V3,V4} 數(shù)據(jù)之間就具有“多對(duì)多”的邏輯結(jié)構(gòu)。
例如,從 V1 出發(fā)可以到達(dá) V2、V3、V4;同樣,從 V2、V3、V4 也可以到達(dá) V1。V1 和其它數(shù)據(jù)之間就是“多對(duì)多”的邏輯關(guān)系。
多對(duì)多關(guān)系和一對(duì)多關(guān)系的區(qū)別在于:一對(duì)多關(guān)系中不存在環(huán)路,而多對(duì)多關(guān)系中存在環(huán)路,比如V1->V3->V2->V1
就是一個(gè)環(huán)路。
針對(duì)每一種邏輯結(jié)構(gòu)的數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)都提供了存儲(chǔ)它們的方案:
查找表存儲(chǔ)結(jié)構(gòu):專門存儲(chǔ)無邏輯結(jié)構(gòu)的數(shù)據(jù);
線性存儲(chǔ)結(jié)構(gòu):專門存儲(chǔ)具有“一對(duì)一”邏輯結(jié)構(gòu)的數(shù)據(jù);
樹存儲(chǔ)結(jié)構(gòu):專門存儲(chǔ)具有“一對(duì)多”邏輯結(jié)構(gòu)的數(shù)據(jù);
圖存儲(chǔ)結(jié)構(gòu):專門用來存儲(chǔ)具有“多對(duì)多”關(guān)系的數(shù)據(jù);
以上這些存儲(chǔ)結(jié)構(gòu),后續(xù)會(huì)一一做詳細(xì)地講解。
總結(jié)
關(guān)于數(shù)據(jù)結(jié)構(gòu),與其說它是一門研究存儲(chǔ)數(shù)據(jù)以及數(shù)據(jù)之間關(guān)系的學(xué)科,還可以這樣概括:它是一門研究數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)和邏輯結(jié)構(gòu)的學(xué)科。通過研究數(shù)據(jù)的物理結(jié)構(gòu),可以掌握存儲(chǔ)數(shù)據(jù)的方法;通過研究數(shù)據(jù)的邏輯結(jié)構(gòu),可以掌握存儲(chǔ)數(shù)據(jù)之間關(guān)系的方法。
數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)有 2 種,分別是集中存儲(chǔ)和分散存儲(chǔ)。如果想集中存儲(chǔ)數(shù)據(jù),就選擇順序存儲(chǔ)結(jié)構(gòu);如果想分散存儲(chǔ)數(shù)據(jù),就擇鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。
數(shù)據(jù)的邏輯結(jié)構(gòu)有 4 種,分別是“無關(guān)系”、“一對(duì)一”、“一對(duì)多”和“多對(duì)多”。無邏輯關(guān)系的數(shù)據(jù)可以選用查找表存儲(chǔ)結(jié)構(gòu);具有“一對(duì)一”關(guān)系的數(shù)據(jù)可以選用線性存儲(chǔ)結(jié)構(gòu);具有“一對(duì)多”關(guān)系的數(shù)據(jù)可以選用樹存儲(chǔ)結(jié)構(gòu);具有“多對(duì)多”關(guān)系的數(shù)據(jù)可以選用圖存儲(chǔ)結(jié)構(gòu)
實(shí)際場景中,確定了數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)和邏輯結(jié)構(gòu),就可以敲定數(shù)據(jù)的存儲(chǔ)方案。比如,數(shù)據(jù)呈現(xiàn)“一對(duì)多”關(guān)系,想分散存儲(chǔ),那么就選用【樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)】。