1.順序表存儲(典型的數組)
原理:順序表存儲是將數據元素放到一塊連續的內存存儲空間,相鄰數據元素的存放地址也相鄰(邏輯與物理統一)。
優點:
(1)空間利用率高。(局部性原理,連續存放,命中率高)
(2)存取速度高效,通過下標來直接存儲。
缺點:
(1)插入和刪除比較慢,比如:插入或者刪除一個元素時,整個表需要遍歷移動元素來重新排一次順序。
(2)不可以增長長度,有空間限制,當需要存取的元素個數可能多於順序表的元素個數時,會出現"溢出"問題.當元素個數遠少於預先分配的空間時,空間浪費巨大。
時間性能 :查找 O(1) ,插入和刪除O(n)。
2.鏈表存儲
原理:鏈表存儲是在程序運行過程中動態的分配空間,只要存儲器還有空間,就不會發生存儲溢出問題,相鄰數據元素可隨意存放,但所占存儲空間分兩部分,一部分存放結點值,另一部分存放表示結點關系間的指針。
優點:
(1)存取某個元素速度慢。
(2)插入和刪除速度快,保留原有的物理順序,比如:插入或者刪除一個元素時,只需要改變指針指向即可。
(3)沒有空間限制,存儲元素的個數無上限,基本只與內存空間大小有關.
缺點:
(1)占用額外的空間以存儲指針(浪費空間,不連續存放,malloc開辟,空間碎片多)
(2)查找速度慢,因為查找時,需要循環鏈表訪問,需要從開始節點一個一個節點去查找元素訪問。
時間性能 :查找 O(n) ,插入和刪除O(1)。
*頻繁的查找卻很少的插入和刪除操作可以用順序表存儲,堆排序,二分查找適宜用順序表.
*如果頻繁的插入和刪除操作很少的查詢就可以使用鏈表存儲
*順序表適宜於做查找這樣的靜態操作;鏈表適宜於做插入、刪除這樣的動態操作。
*若線性表長度變化不大,如果事先知道線性表的大致長度,比如一年12月,一周就是星期一至星期日共七天,且其主要操作是查找,則采用順序表;若線性表長度變化較大或根本不知道多大時,且其主要操作是插入、刪除,則采用鏈表,這樣可以不需要考慮存儲空間的大小問題。