陣列概念:
陣列是一種線性表資料結構,它用一組連續的記憶體空間,來儲存一組具有相同型別結構的資料。
線性:顧名思義,線性表就是資料排成像一條線一樣的資料結構。每個線性表上的資料最多只有前後兩個方向。其實除了陣列,鍊錶,佇列,棧等也是線性表結構
而與它相對立的概念就是非線性表,比如說二叉樹,堆,圖。之所以叫非線性,是因為,在非線性表中,資料之間並不是簡單的前後關係。
第二個是連續的記憶體空間和相同型別的資料。正是因為這兩個限制,它才有了乙個堪稱「殺手鐗」的特性:「隨機訪問」。但有利就有弊,隨機訪問對應的就是查詢很快,但是當插入和刪除的時候,為了保證連續性,需要對資料進行大量的遷移工作。
接下來我們來看下插入操作
陣列長度為n,現在我們要將乙個資料插入到陣列中的第k個位置。為了把第k個位置空出來,就需要把k後面所有的資料依次往後面移動一位,如果我們是在陣列開頭插入資料,那麼就需要把所有的資料都順序往後面移動,這個時候時間複雜度就是o(n),如果是在陣列末尾插入乙個資料,那麼就不需要移動資料,時間複雜度就是o(1),所以最壞情況下的時間複雜度是o(n),
最好情況下的時間複雜度是o(1),但是其實在真正的工作當中,出現這兩種情況的機率很小,大多數都是在陣列開頭到結尾的位置插入資料,那麼平均算下來時間複雜度就是o(n)。
我們再來看刪除操作
跟插入資料類似,如果我們要刪除第k個位置的資料,為了記憶體的連續性,也需要搬移資料,不然中間就會出現空洞,記憶體就不連續了。
和插入類似,如果刪除陣列末尾的資料,則最好情況時間複雜度為o(1),如果刪除開頭的資料,則最壞情況時間複雜度為o(n);平均情況時間複雜度也為o(n)。
實際上在某些特殊情況下,我們並不一定非得追求陣列中資料的連續性。如果我們將多次刪除操作集中在一起執行,刪除的效率是不是會提高很多呢?
陣列a[10]中儲存了8個元素:a,b,c,d,e,f,g,h。現在我們要依次刪除a,b,c三個元素
為了避免搬移三次資料,我們可以給這三個資料打上已刪除的標示,當陣列沒有更多空間儲存資料時,我們在觸發一次真正的刪除操作,這樣就大大減少了刪除操作導致的資料搬移。
內容小結
我們今天學習了陣列。它可以說是最基礎,最簡單的資料結構了。陣列用一塊連續的記憶體空間,來儲存相同型別的一組資料,最大的特點就是支援隨機訪問,但插入,刪除操作也因此變得比較低效,平均情況時間複雜度為o(n)。在平時的業務開發中,我們可以直接使用程式語言中提供的容器類,但是,如果是特別底層的開發,直接使用陣列可能會更合適。
資料結構 陣列
建立陣列 大小為50 棧空間存myarray引用 堆空間存乙個大小為50,預設值為0的陣列。棧空間myarray引用指向堆空間該陣列。int myarray new int 50 public class testarray public class testarray if s intarray....
資料結構 陣列
陣列 就是相同型別的資料按一定順序排列的集合,把有限個型別相同的資料元素用乙個名字表示,通過編號來區分。名字即為陣列名,編號即為下標。陣列是最簡單 使用最廣泛的一種資料結構,其實就是一塊連續的記憶體,哪怕物理上不連續,邏輯上也是連續的,連續存放著一組相同型別資料元素。陣列的定義 type 變數名 n...
資料結構 陣列
陣列 陣列是一種佔據連續記憶體並按順序儲存資料的簡單的資料結構。建立陣列時,需要首先指定陣列的容量,然後依據大小分配記憶體。由於有時候我們需要使用陣列的容量不確定,可能開闢的記憶體遠超實際使用的記憶體,所以陣列的空間效率不好。由於陣列在記憶體中是連續的儲存空間,所以它的時間效率很高,可以在o 1 的...