数据结构一—— 数组
文章出處:極客時(shí)間《數(shù)據(jù)結(jié)構(gòu)和算法之美》-作者:王爭(zhēng)。該系列文章是本人的學(xué)習(xí)筆記。
如何實(shí)現(xiàn)隨機(jī)訪問(wèn)
數(shù)組是一種線(xiàn)性表數(shù)據(jù)結(jié)構(gòu)。它用一組連續(xù)的內(nèi)存空間,來(lái)存儲(chǔ)一組具有相同類(lèi)型的數(shù)據(jù)。
線(xiàn)性表
線(xiàn)性表的數(shù)據(jù)最多只有前和后兩個(gè)方向。數(shù)組、棧、隊(duì)列、鏈表都是線(xiàn)性表。
非線(xiàn)性表:樹(shù)、圖、堆。
連續(xù)的內(nèi)存空間
a[i]_address=base_address+i?data_type_sizea[i]\_address=base\_address+i*data\_type\_sizea[i]_address=base_address+i?data_type_size,data_type_size表示數(shù)組中每個(gè)元素的大小。
如果數(shù)組下標(biāo)從1開(kāi)始,那么在查找a[i]_address=base_address+(i?1)?data_type_sizea[i]\_address=base\_address+(i-1)*data\_type\_sizea[i]_address=base_address+(i?1)?data_type_size會(huì)多一次減法操作。這可能是大多數(shù)語(yǔ)言數(shù)組下標(biāo)從0開(kāi)始的原因。
與鏈表的區(qū)別
數(shù)組支持隨機(jī)訪問(wèn),復(fù)雜度O(1)。鏈表適合插入刪除。
低效地插入和刪除
插入:如果某個(gè)位置a[i]已經(jīng)被占用了,就需要將i到最后一個(gè)元素拷貝到i+1到count位置,然后a[i]=val。平均時(shí)間復(fù)雜度O(n)。
改進(jìn)策略:大多數(shù)時(shí)候我們不需要追求順序性,那么我們可以把a(bǔ)[i]復(fù)制到數(shù)組末尾,將 當(dāng)前元素賦值給a[i]。例如數(shù)組a[10],已經(jīng)存入元素:1,2,3,4,5。現(xiàn)在想插入a[2]=10,那么插入完成后數(shù)組變?yōu)?#xff1a;1,2,10,4,5,3。
刪除:因?yàn)閮?nèi)存塊是連續(xù)的,當(dāng)刪除i位的元素后,從i+1到count的元素需要向前遷移。這樣平均復(fù)雜度也是O(n)。
刪除的改進(jìn)策略可以是:刪除的位置先做標(biāo)記不做遷移,等空間不夠的時(shí)候再做遷移。這就是Java虛擬的標(biāo)記清除算法。
警惕數(shù)組越界
數(shù)組越界是通常需要處理的問(wèn)題。在C中數(shù)組越界可能會(huì)產(chǎn)生意想不到的結(jié)果。
容器能否完全替代數(shù)組
在某些場(chǎng)合還是用數(shù)組不會(huì)用容器。例如:
1 數(shù)組可以存儲(chǔ)基本數(shù)據(jù)類(lèi)型,速度上更快。在已知數(shù)組大小,并且操作簡(jiǎn)單的情況下數(shù)組是個(gè)更好的選擇。
2 多維數(shù)組一般用數(shù)組表示。a[][] 這樣的表示比List<List> 這樣的結(jié)構(gòu)更容易接受。
總結(jié)
以上是生活随笔為你收集整理的数据结构一—— 数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大网高级技术笔记(一)
- 下一篇: MOSSE算法推导