最近開始學習王爭老師的《資料結構與演算法之美》,通過總結再加上自己的思考的形式記錄這門課程,文章主要作為學習歷程的記錄。
陣列是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。(對這句話進行解釋,引出了以下幾個概念)
1.線性表:陣列,佇列,棧,鍊錶
非線性表:樹和圖
2.連續的記憶體空間和相同型別的資料
由於這兩個限制,若想在陣列中刪除或插入乙個資料,為了保證連續性,就需要做大量的資料搬移工作。
將鍊錶與陣列進行對比,可以得出結論:鍊錶適合插入和刪除,時間複雜度o(1);陣列適合查詢操作,但查詢時間複雜度並不為o(1)。即便是排好序的陣列,用二分查詢,時間複雜度也是o(logn)。故正確的表述為陣列支援隨機訪問,根據下標隨機訪問的時間複雜度為o(1)。
1.陣列的插入操作
若在陣列的末尾插入元素,此時不需要移動資料,則最好時間複雜度為o(1)
若在陣列的開頭插入元素,那所有的資料都需要往後移一位,此時最壞時間複雜度為o(n)
因此平均情況時間複雜度為(1+
2+..
.+n)
/n=o
(n
)(1+2+...+n)/n=o(n)
(1+2+.
..+n
)/n=
o(n)
2.陣列的刪除操作
若在陣列的末尾刪除元素,此時不需要移動資料,則最好時間複雜度為o(1)
若在陣列的開頭刪除元素,那所有的資料都需要往前移一位,此時最壞時間複雜度為o(n)
因此平均情況時間複雜度為(1+
2+..
.+n)
/n=o
(n
)(1+2+...+n)/n=o(n)
(1+2+.
..+n
)/n=
o(n)
此外,若執行多次刪除操作時,可以記錄下已經被刪除的資料,每次的刪除操作並不是搬移資料,只是記錄資料已經被刪除,當陣列沒有更多的儲存空間時,再觸發一次真正的刪除操作。
以leetcode上第35題搜尋插入位置為例,給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。
示例 1:
輸入: [1,3,5,6], 5
輸出: 2
示例 2:
輸入: [1,3,5,6], 2
輸出: 1
class
solution
(object):
defsearchinsert
(self, nums, target)
:"""
:type nums: list[int]
:type target: int
:rtype: int
"""flag =
0for i in
range
(len
(nums)):
if nums[i]
==target:
flag =
1return i
if flag ==0:
if target<=nums[0]
:return
0elif target>=nums[-1
]:return
len(nums)
else
:for i in
range(0
,len
(nums)-1
):if nums[i]
<=target and nums[i+1]
>=target:
return i+
1
從偏移角度理解a[0],0為偏移量。
a[k]_address = base_address + k * type_size
如果從1計數,計算陣列元素 a[k] 的記憶體位址就會變為下式,會多出k-1
a[k]_address = base_address + (k-1)*type_size
因此,若從1開始計數,則每次訪問資料的時候都會多一次進行減法運算,增加cpu的負擔。
資料結構 陣列
建立陣列 大小為50 棧空間存myarray引用 堆空間存乙個大小為50,預設值為0的陣列。棧空間myarray引用指向堆空間該陣列。int myarray new int 50 public class testarray public class testarray if s intarray....
資料結構 陣列
陣列 就是相同型別的資料按一定順序排列的集合,把有限個型別相同的資料元素用乙個名字表示,通過編號來區分。名字即為陣列名,編號即為下標。陣列是最簡單 使用最廣泛的一種資料結構,其實就是一塊連續的記憶體,哪怕物理上不連續,邏輯上也是連續的,連續存放著一組相同型別資料元素。陣列的定義 type 變數名 n...
資料結構 陣列
陣列 陣列是一種佔據連續記憶體並按順序儲存資料的簡單的資料結構。建立陣列時,需要首先指定陣列的容量,然後依據大小分配記憶體。由於有時候我們需要使用陣列的容量不確定,可能開闢的記憶體遠超實際使用的記憶體,所以陣列的空間效率不好。由於陣列在記憶體中是連續的儲存空間,所以它的時間效率很高,可以在o 1 的...