對於陣列來說,查詢就是檢查它是否包含某個值,如果包含,還得給出其索引。
想要查詢陣列中是否存在某個值,計算機會先從索引0 開始,檢查其值,如果不匹配,則繼續下乙個索引,以此類推,直至找到為止。
但索引2 的值仍不匹配,計算機只好再跳到下一格。
找到"dates"在索引3 那裡。自此,計算機不用再往後跳了,因為結果已經得到。
因為我們檢查了4 個格仔才找到想要的值,所以這次操作總計是4 步。
這種逐個格仔去檢查的做法,就是最基本的查詢方法——線性查詢。
在陣列上進行線性查詢最多要多少步呢?如果我們要找的值剛好在陣列的最後乙個格仔裡(如本例的elderberries),那麼計算機從頭到尾檢查每個格仔,會在最後才找到。
同樣,如果我們要找的值並不存在於陣列中,那麼計算機也還是得查遍每個格仔,才能確定這個值不在陣列中。
於是,乙個5 格的陣列,其線性查詢的步數最大值是5,而對於乙個500 格的陣列,則是500。
以此類推,乙個n 格的陣列,其線性查詢的最多步數是n(n 可以是任何自然數)。
可見,無論是多長的陣列,查詢都比讀取要慢,因為讀取永遠都只需要一步,而查詢卻可能需要多步。
插入準確地說,是插入乙個新值到陣列之中。
往陣列裡插入乙個新元素的速度,取決於你想把它插入到哪個位置上。
假設我們想要在購物清單的末尾插入"figs"。那麼只需一步。因為之前說過了,計算機知道陣列開頭的記憶體位址,也知道陣列包含多少個元素,所以可以算出要插入的記憶體位址,然後一步跳到那裡插入就行了。
但在陣列開頭或中間插入,就另當別論了。這種情況下,我們需要移動其他元素以騰出空間,於是得花費額外的步數。例如往索引2 處插入"figs"。
為了達到目的,我們必須先把"cucumbers"、"dates"和"elderberries"往右移,以便空出索引2。而這也不是一步就能移好,因為我們首先要將"elderberries"右移一格,以空出位置給"dates",然後再將"dates"右移,以空出位置給"cucumbers"。
第1 步:"elderberries"右移。
第2 步:"date"右移。
第3 步:"cucembers"右移。
第4 步:至此,可以在索引2 處插入"figs"了。
如上所示,整個過程有4 步,開始3 步都是在移動資料,剩下1 步才是真正的插入資料。
最低效(花費最多步數)的插入是插入在陣列開頭。因為這時候需要把陣列所有的元素都往右移。
於是,乙個含有n 個元素的陣列,其插入資料的最壞情況會花費n + 1 步。即插入在陣列開頭,導致n 次移動,加上一次插入。
陣列的刪除就是消掉其某個索引上的資料。
我們找回最開始的那個陣列,刪除索引2 上的值,即"cucumbers"。
第1 步:刪除"cucumbers"。
雖然刪除"cucumbers"好像一步就搞定了,但這帶來了新的問題:陣列中間空出了乙個格仔。因
為陣列中間是不應該有空格的,所以,我們得把"dates"和"elderberries"往左移。
第2 步:將"dates"左移。
第3 步:將"elderberries"左移。
結果,整個刪除操作花了3 步。其中第1 步是真正的刪除,剩下的2 步是移資料去填空格。
所以,刪除本身只需要1 步,但接下來需要額外的步驟將資料左移以填補刪除所帶來的空隙。
跟插入一樣,刪除的最壞情況就是刪掉陣列的第乙個元素。因為陣列不允許空元素,當索引
0 空出,那麼剩下的所有元素都要往左移去填空。
對於含有5 個元素的陣列,刪除第乙個元素需要1 步,左移剩餘的元素需要4 步。
而對於500
個元素的陣列,刪除第乙個元素需要1 步,左移剩餘的元素需要499 步。
可以推出,對於含有n
個元素的陣列,刪除操作最多需要n 步。
如何分析資料結構的時間複雜度,那就可以開始探索各種資料結構的效能差異
了。了解這些非常重要,因為資料結構的效能差異會直接造成程式的效能差異。
資料結構 陣列(一) 查詢陣列中第二小的元素
第二小的元素 這裡有很多方法可以實現 方案一 按遞增順序對陣列進行排序,堆排 快排 歸併排序等等都可以達到目的。排序陣列中的前兩個元素是兩個最小的元素。這個解的時間複雜度是o nlogn 關於排序演算法後續會繼續更新。方案二 掃瞄陣列兩次。在第一次遍歷中找到最小元素。讓這個元素為x,在第二次遍歷中,...
資料結構 向陣列中新增元素
size是陣列的第乙個空元素的定位符。向所有元素後新增乙個新元素 public void addlast int e data size e size add size,e 在所有元素前新增乙個新元素 public void addfirst int e 在第index個位置插入乙個新元素e 總結 ...
資料結構之陣列元素的刪除
資料結構之陣列元素的刪除 描述 想要刪除陣列中某個下標的值,如何刪除?參考 陣列的刪除 根據下標去刪除陣列中的值 author zhang public class arraydel 列印 system.out.println 刪除前的陣列資料 arrays.tostring oldarray 5,...