數(shù)據(jù)結(jié)構(gòu)與算法_簡介
數(shù)據(jù)結(jié)構(gòu)是一門研究數(shù)據(jù)存儲方式的學科,在數(shù)據(jù)結(jié)構(gòu)看來,數(shù)據(jù)的存儲方式要從以下兩個角度來綜合分析:
物理結(jié)構(gòu):在內(nèi)存中,數(shù)據(jù)可以選擇集中存放,也可以選擇分散存放;
邏輯結(jié)構(gòu):數(shù)據(jù)之間的邏輯關(guān)系有四種,分別是無關(guān)系、“一對一”關(guān)系、“一對多”關(guān)系和“多對多”關(guān)系。
數(shù)據(jù)結(jié)構(gòu)教我們有效地存儲數(shù)據(jù),既要存儲數(shù)據(jù)本身,還要存儲數(shù)據(jù)之間的關(guān)系。
存儲數(shù)據(jù)本身,也就是將數(shù)據(jù)存儲到內(nèi)存里。數(shù)據(jù)在內(nèi)存中的存儲狀態(tài),就稱為數(shù)據(jù)的存儲結(jié)構(gòu),也叫物理結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)中,將數(shù)據(jù)之間的關(guān)系稱為數(shù)據(jù)的邏輯結(jié)構(gòu)。

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

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

兩種存儲結(jié)構(gòu)各有優(yōu)勢,將數(shù)據(jù)集中存儲,方便后續(xù)查找數(shù)據(jù);將數(shù)據(jù)分散存儲,方便后續(xù)增加或者刪除數(shù)據(jù)。
數(shù)據(jù)結(jié)構(gòu)中,用順序存儲結(jié)構(gòu)實現(xiàn)數(shù)據(jù)的集中存儲,用鏈式存儲結(jié)構(gòu)(鏈表)實現(xiàn)數(shù)據(jù)的分散存儲。
數(shù)據(jù)的邏輯結(jié)構(gòu)
數(shù)據(jù)之間可能存在的關(guān)系,有以下 4 種情況:
1)無關(guān)系

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

3)一對多

圖 5?所示的“家譜圖”中,數(shù)據(jù)之間就是“一對多”的邏輯結(jié)構(gòu)。
以“張平”為例,他的父輩是“張亮”;他有兩個孩子,分別是“張晶”和“張磊”?!皬埰健焙推渌鼣?shù)據(jù)之間就是“一對多”的關(guān)系,整個數(shù)據(jù)集呈現(xiàn)“一對多”的邏輯結(jié)構(gòu)。
4)多對多

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