判斷題:使用鏈表比使用數組更容易造成內存碎片化(錯誤)

正如上圖所示,數組在內存中是一段連續的存儲單元,每個數據依次放在每個單元中。分析這種結構,我們可以得出以下幾個結論:

創建一個數組,必須聲明其長度,以在內存中尋找合適的一段連續存儲單元。這也意味着數組的大小是固定的,我們無法動態調整其大小。

想要獲取數組中第i個元素,其時間複雜度是 O(1),因爲可以根據其地址直接找到它。同理修改也是。

數組對查詢表現一般,要想查找一個元素,需要遍歷,時間複雜度爲O(n)。

因爲地址連續,想要在數組中插入一個元素是複雜的,因爲從插入位置起,後邊的所有元素都需要向後移動一位。同理刪除也是,只是移動方向爲向前。並且,當數組存滿時,就無法繼續插入了。

因爲數組要佔據一整塊內存,有可能產生許多的碎片,也可能因爲找不到合適的內存塊,而導致存儲失敗。

總結起來就是:數組大小固定,查找迅速,增刪複雜,需要完整的內存塊,容易產生碎片。

鏈表
鏈表是一種離散存儲結構,其在內存中存儲不是連續的,每個數據元素都通過一個指針指向其下一個元素的地址。根據指針域的不同,鏈表又分爲單鏈表、雙向鏈表、循環鏈表等,這裏我們只分析單鏈表。示意圖如下所示: 


分析這種結構,我們可以得出以下幾個結論:

聲明一個鏈表時,不需要知道其長度,也不需要連續的內存塊,所以其大小可以動態調整。

鏈表的每個元素都分爲數據域和指針域,前者是實際存儲的數據,後者則指向下一個元素的地址。和數組相比,每個元素需要佔用的內存更大了。

要獲取鏈表的第 i 個元素變得複雜,因爲其地址存放在它上一個元素的指針域裏,所以只能從第一個元素起,進行 i 次操作。同理修改也是。

鏈表對查詢表現也一般,需要遍歷,時間複雜度爲O(n)。

增加與刪除一個元素更方便了,因爲沒有對內存地址的限制,我們只需要在對應節點合理處理下指針域的值,就可以把一個元素插入鏈表或者從鏈表刪除。

鏈表對內存的要求很小,只要能夠存儲下一個數據元素的內存塊都可以使用,因此不會造成碎片化。

總結起來就是:大小可以動態調整,增刪迅速,查找較慢,數據元素所佔內存略多,不需要整塊內存塊,不會造成碎片化。
 

所以更容易造成碎片化的是數組,而鏈表不需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章