日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

线性表之顺序表与单链表的区别及优缺点

發(fā)布時(shí)間:2024/9/27 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性表之顺序表与单链表的区别及优缺点 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這里比較的是基于C語言實(shí)現(xiàn)的順序表與單鏈表,與其他語言的實(shí)現(xiàn)可能會(huì)有差異,但我相信語言是相通的,它們的實(shí)現(xiàn)機(jī)制應(yīng)該也差不多。
1、What
什么是順序表和單鏈表
①順序表:
順序表是在計(jì)算機(jī)內(nèi)存中以數(shù)組的形式保存的線性表,是指用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu)。只要確定了起始位置,表中任一元素的地址都通過下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L  1≤i≤n 其中,L是元素占用存儲(chǔ)單元的長度。

②單鏈表:
單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。它的數(shù)據(jù)是以結(jié)點(diǎn)(類型一般為結(jié)構(gòu)體)來表示的,每個(gè)結(jié)點(diǎn)的構(gòu)成:數(shù)據(jù)(類型為要存儲(chǔ)的數(shù)據(jù)的類型) + 指針(結(jié)構(gòu)體指針),數(shù)據(jù)就是鏈表里具體要存儲(chǔ)的東西,指針就是用來把每個(gè)節(jié)點(diǎn)都連接起來,使它們形成一個(gè)鏈狀。

結(jié)點(diǎn):

鏈表:

2、Compare
二者的優(yōu)缺點(diǎn)比較

①空間上的比較(Space)
a. 空間的開辟:
順序表的實(shí)現(xiàn)一般是實(shí)現(xiàn)連續(xù)開辟一段空間,然后在進(jìn)行數(shù)據(jù)的增刪查改(靜態(tài)順序表),所以順序表一般是固定空間大小的;而單鏈表則是一次只開辟一個(gè)結(jié)點(diǎn)的空間,用來存儲(chǔ)當(dāng)前要保存的數(shù)據(jù)及指向下一個(gè)結(jié)點(diǎn)或NULL的指針,所以單鏈表的空間大小時(shí)動(dòng)態(tài)變化的。(當(dāng)然,順序表也可以在初始化時(shí)利用malloc函數(shù)來開辟一塊空間,每當(dāng)空間不夠用時(shí),再用realloc來把當(dāng)前空間擴(kuò)容成2倍,從而也能實(shí)現(xiàn)空間的動(dòng)態(tài)變化(動(dòng)態(tài)順序表))。

b. 空間的使用:
當(dāng)我們不知道要存儲(chǔ)多少數(shù)據(jù)時(shí),用順序表來開辟的空間如果太大,就會(huì)造成一定程度上的浪費(fèi),而用單鏈表是實(shí)現(xiàn)時(shí),因?yàn)槭敲啃枰鎯?chǔ)一個(gè)數(shù)據(jù)時(shí),才開辟一個(gè)空間,雖然有非數(shù)據(jù)項(xiàng)的指針占空間,但相比順序表來說,浪費(fèi)不是那么明顯;反之,當(dāng)我們知道存儲(chǔ)的數(shù)據(jù)的數(shù)量時(shí),用順序表來開辟對(duì)應(yīng)的空間大小,來存儲(chǔ)數(shù)據(jù),因?yàn)轫樞虮碇忻總€(gè)元素的存儲(chǔ)密度為 1,就完全不會(huì)有浪費(fèi)的空間,而用單鏈表,因?yàn)槊總€(gè)結(jié)點(diǎn)都會(huì)有非數(shù)據(jù)項(xiàng)得指針,那么就會(huì)造成空間的浪費(fèi)。再者,編譯器會(huì)為每個(gè)程序從內(nèi)存上分配一段空間,給該程序使用。然而我們每次開辟空間時(shí)都是在隨機(jī)的位置開辟的,那么使用單鏈表,就會(huì)多次的在程序分配到的這塊空間上開辟空間,因?yàn)槊看味际情_辟的位置都是隨機(jī)的,那么可能會(huì)把這塊空間搞得七零八碎,出現(xiàn)很多小的一般使用不到的碎片空間,這樣很大程度上造成了空間的浪費(fèi),而使用順序表的話,不會(huì)經(jīng)常開辟空間,這樣就減少了碎片空間的出現(xiàn),那么就一定程度上節(jié)省了空間。

c. 對(duì)CPU高速緩存的影響:
因?yàn)轫樞虮淼目臻g一般是連續(xù)開辟的,而且一次會(huì)開辟存儲(chǔ)多個(gè)元素的空間,所以在使用順序表時(shí),可以一次把多個(gè)數(shù)據(jù)寫入高速緩存,再寫入主存,順序表的CPU高速緩存效率更高,且CPU流水線也不會(huì)總是被打斷;而單鏈表是每需要存儲(chǔ)一個(gè)數(shù)據(jù)才開辟一次空間,所以每個(gè)數(shù)據(jù)存儲(chǔ)時(shí)都要單獨(dú)的寫入高速緩存區(qū),再寫入主存,這樣就造成了,單鏈表CPU高速緩存效率低,且CPU流水線會(huì)經(jīng)常被打斷。

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

②時(shí)間上的比較(Time)

a. 訪問隨機(jī)元素的時(shí)間復(fù)雜度:
因?yàn)轫樞虮淼慕Y(jié)構(gòu)就像是數(shù)組一樣,可以用下標(biāo)來訪問它的元素,所以它的元素是支持隨機(jī)訪問的;相比之下,單鏈表的數(shù)據(jù)是鏈?zhǔn)酱鎯?chǔ)的,它的元素是不支持隨機(jī)訪問的,想要知道某個(gè)元素,只能從頭結(jié)點(diǎn)開始遍歷整個(gè)鏈表,知道找到了該元素為止。因此順序表訪問隨機(jī)元素的時(shí)間復(fù)雜度是O(1),而單鏈表訪問隨機(jī)元素的平均時(shí)間復(fù)雜度是O(n)。

b. 隨機(jī)位置插入、刪除元素的時(shí)間復(fù)雜度:
因?yàn)轫樞虮淼脑厥沁B續(xù)存儲(chǔ)的,因此要在特定位置插入、刪除元素需要把它之后的元素全部后移或前移一個(gè)元素的位置,時(shí)間開銷很大;而單鏈表在插入或刪除元素時(shí),只需要改變它的前驅(qū)元素及插入或刪除元素的指向即可。因此,順序表在插入隨機(jī)位置插入、刪除元素的平均時(shí)間復(fù)雜度是O(n),單鏈表在插入隨機(jī)位置插入、刪除元素的時(shí)間復(fù)雜度是O(1)。

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

3、Summary

綜合上述所言,順序表和單鏈表各有各的優(yōu)缺點(diǎn),使用哪一種會(huì)好一些要結(jié)合具體的問題而言,不能一概而論。
比如:
在查詢操作使用的比較頻繁時(shí),使用順序表會(huì)好一些;在插入、刪除操作使用的比較頻繁時(shí),使用單鏈表會(huì)好一些。

PS:使用順序表和鏈表都必須滿足每個(gè)元素占有相同大小的內(nèi)存空間,并且這個(gè)大小是固定的

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的线性表之顺序表与单链表的区别及优缺点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。