數據結構之數組

文章來源:http://blog.seclibs.com/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%b9%8b%e6%95%b0%e7%bb%84/算法

在說數組以前我們先明確兩個概念,什麼是線性表,什麼是非線性表編程

顧名思義,線性表就是把數據排成一條,每一個數據只有先後兩種狀況,常見的線性表有數組、鏈表、隊列、棧數組

那非線性表就更好理解了,數據不是按照一條線來排列的,每一個數據並不僅有先後兩個方向,常見的有二叉樹、堆、圖數據結構

明白了這個概念以後,我們再來講數組,什麼是數組?數據結構和算法

數組不只是大多數編程語言中的一個數據類型,它更是一個最基礎的數據結構。編程語言

數組(Array)是一種線性表數據結構。它用一組連續的內存空間,來存儲一組具備相同類型的數據。學習

關於線性表前面已經說過了,接下來講具備連續的內存空間、存儲相同類型的數據,也正是由於這一點才使數組有了隨機訪問的特性。blog

咱們拿下面這個例子來進行說明,有一個長度爲10的int類型的數組,咱們給它分配一塊連續內存空間 1000~1039,內存塊的首地址爲1000排序

當咱們須要訪問其中的數據的時候,計算機會先經過一個尋址公式來找到內存地址,而後再讀取其中的數據。隊列

在數組中咱們使用的尋址公式爲

a[i]_address = base_address + i * data_type_size

base_address爲內存塊的首地址1000,data_type_size爲數據類型的大小,這裏咱們使用的是int類型,因此data_type_size爲4個字節,也正是這個緣由,在不少語言中,都將數組的第一個下標定爲0,由於在尋址的時候,能夠直接獲得內存地址,而不須要再將數值減一後再進行計算,雖然咱們口算很簡單,可是在CPU中,它所進行的運算仍是至關多的。

當咱們須要獲得數組中第一個元素的內容時,便直接套公式1000+0*4=1000,便直接獲得了內存地址。

因此數組適合查詢,支持隨機訪問,在根據下標進行隨機訪問時時間複雜度爲O(1),這裏須要注意一下,說數組的時間複雜度的時候必定要說明在跟進下標進行隨機訪問的時候,由於若是使用二分查找的話,即使已經進行過排序的數組,時間複雜度也是O(logn)。

可是數組的隨機訪問的特性有利有弊,由於數組要保證空間是連續的,因此在增長和刪除的時候,就須要進行大量的操做將數據進行移動,將是很是低效的。

咱們先來講插入操做,假如數組的長度爲x,那麼若是要在第y個位置插入一個數據,那麼就須要將y到x的全部數據都日後挪一位,將第y個位置騰出來。

咱們來看一下它所涉及到的時間複雜度,若是插入的數據在最後一個,就不須要進行移動,最好時間複雜度爲O(1);若是插入的數據在第一個,則後面的每個數據都須要日後挪一個,最壞時間複雜度爲O(n);由於在每個位置插入的機率都是同樣的,因此平均時間複雜度爲(1+2+…+n)/n=O(n)。

固然這是對數組數據是有序的狀況下來講的,若是數據是無序的話,就不須要這些操做了,若是要在第y位插入數據,只須要將第y位的數據移動到整個數組的最後面,而後再將須要插入的數據插入便可,這個時候的時間複雜度就降爲了O(1)。

接下來講刪除操做,與插入數據相似,若是要刪除第y位的數據,就須要將y到n的數據都往前挪一個,不然內存空間就不連續了,若是刪除數組末尾的數據,最好時間複雜度爲 O(1);若是刪除開頭的數據,最壞時間複雜度爲 O(n),刪除每個數據的機率是相同的,平均時間複雜度爲 O(n)。

數組到這裏也就結束了,再接着就是代碼實現。

參考文檔

極客時間-數據結構和算法之美

文章首發公衆號和我的博客:

公衆號:無意的夢囈(wuxinmengyi)

這是一個記錄紅隊學習、信安筆記,我的成長的公衆號

掃碼關注便可

博客:http://blog.seclibs.com/

記錄紅隊相關學習筆記

相關文章
相關標籤/搜索