線性表之順序表與單鏈表的區別及優缺點

2021-07-10 17:07:59 字數 2432 閱讀 7974

這裡比較的是基於c語言實現的順序表與單鏈表,與其他語言的實現可能會有差異,但我相信語言是相通的,它們的實現機制應該也差不多。

1、what

什麼是順序表和單鏈表

①順序表:

順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組位址連續的儲存單元依次儲存資料元素的線性結構。只要確定了起始位置,表中任一元素的位址都通過下列公式得到:loc(ai)=loc(a1)+(i-1)*l  1≤i≤n 其中,l是元素占用儲存單元的長度。

②單鏈表:

單鏈表是一種鏈式訪問的資料結構,用一組位址任意的儲存單元存放線性表中的資料元素。它的資料是以結點(型別一般為結構體)來表示的,每個結點的構成:資料(型別為要儲存的資料的型別) + 指標(結構體指標),資料就是煉表裡具體要儲存的東西,指標就是用來把每個節點都連線起來,使它們形成乙個鏈狀。

鍊錶:

二者的優缺點比較

①空間上的比較(space)

a. 空間的開闢:

順序表的實現一般是實現連續開闢一段空間,然後在進行資料的增刪查改(靜態順序表),所以順序表一般是固定空間大小的;而單鏈表則是一次只開闢乙個結點的空間,用來儲存當前要儲存的資料及指向下乙個結點或null的指標,所以單鏈表的空間大小時動態變化的。(當然,順序表也可以在初始化時利用malloc函式來開闢一塊空間,每當空間不夠用時,再用realloc來把當前空間擴容成2倍,從而也能實現空間的動態變化(動態順序表))。

、 b. 空間的使用:

當我們不知道要儲存多少資料時,用順序表來開闢的空間如果太大,就會造成一定程度上的浪費,而用單鏈表是實現時,因為是每需要儲存乙個資料時,才開闢乙個空間,雖然有非資料項的指標佔空間,但相比順序表來說,浪費不是那麼明顯;反之,當我們知道儲存的資料的數量時,用順序表來開闢對應的空間大小,來儲存資料,因為順序表中每個元素的儲存密度為 1,就完全不會有浪費的空間,而用單鏈表,因為每個結點都會有非資料項得指標,那麼就會造成空間的浪費。再者,編譯器會為每個程式從記憶體上分配一段空間,給該程式使用。然而我們每次開闢空間時都是在隨機的位置開闢的,那麼使用單鏈表,就會多次的在程式分配到的這塊空間上開闢空間,因為每次都是開闢的位置都是隨機的,那麼可能會把這塊空間搞得七零八碎,出現很多小的一般使用不到的碎片空間,這樣很大程度上造成了空間的浪費,而使用順序表的話,不會經常開闢空間,這樣就減少了碎片空間的出現,那麼就一定程度上節省了空間。

c. 對cpu快取記憶體的影響:

因為順序表的空間一般是連續開闢的,而且一次會開闢儲存多個元素的空間,所以在使用順序表時,可以一次把多個資料寫入快取記憶體,再寫入主存,順序表的cpu快取記憶體效率更高,且cpu流水線也不會總是被打斷;而單鏈表是每需要儲存乙個資料才開闢一次空間,所以每個資料儲存時都要單獨的寫入快取記憶體區,再寫入主存,這樣就造成了,單鏈表cpu快取記憶體效率低,且cpu流水線會經常被打斷。

從這兒看,貌似順序表要更好一些,真是如此嗎?繼續看下去。

②時間上的比較(time)

a. 訪問隨機元素的時間複雜度:

因為順序表的結構就像是陣列一樣,可以用下標來訪問它的元素,所以它的元素是支援隨機訪問的;相比之下,單鏈表的資料是鏈式儲存的,它的元素是不支援隨機訪問的,想要知道某個元素,只能從頭結點開始遍歷整個鍊錶,知道找到了該元素為止。因此順序表訪問隨機元素的時間複雜度是o(1),而單鏈表訪問隨機元素的平均時間複雜度是o(n)。

b. 隨機位置插入、刪除元素的時間複雜度:

因為順序表的元素是連續儲存的,因此要在特定位置插入、刪除元素需要把它之後的元素全部後移或前移乙個元素的位置,時間開銷很大;而單鏈表在插入或刪除元素時,只需要改變它的前驅元素及插入或刪除元素的指向即可。因此,順序表在插入隨機位置插入、刪除元素的平均時間複雜度是o(n),單鏈表在插入隨機位置插入、刪除元素的時間複雜度是o(1)。

一般來說線性表(順序表和單鏈表都屬於線性表)的插入刪除操作會被執行的頻繁一些,因此,使用單鏈表的頻率較大。

3、summary

綜合上述所言,順序表和單鏈表各有各的優缺點,使用哪一種會好一些要結合具體的問題而言,不能一概而論。

比如:

在查詢操作使用的比較頻繁時,使用順序表會好一些;在插入、刪除操作使用的比較頻繁時,使用單鏈表會好一些。

ps:使用順序表和煉表都必須滿足每個元素占有相同大小的記憶體空間,並且這個大小是固定的

線性表之順序表與單鏈表的區別與優缺點

這裡比較的是基於c語言實現的順序表與單鏈表,與其他語言的實現可能會有差異,但我相信語言是相通的,它們的實現機制應該也差不多。1 what 什麼是順序表和單鏈表 順序表 順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組位址連續的儲存單元依次儲存資料元素的線性結構。只要確定了起始位置,表中任...

線性表 順序表與單鏈表(模板)

順序表 線性表的順序儲存結構,靜態儲存分配,通常用一位陣列來實現 include using namespace std const int maxsize 100 template typename t class seqlist template typename t seqlist seqli...

線性表及單鏈表

一.頭指標與頭結點的異同 頭指標 頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標。頭指標具有標識作用,所以常用頭指標冠以鍊錶的名字。無論鍊錶是否為空,頭指標均不為空,頭指標是鍊錶的必要元素。頭結點 頭結點是為了操作的統一和方便而建立的,放在第一元素的結點之前,其資料域一般無...