數據結構與算法---數組

數組的定義

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

其中有幾個重要的概念:

  • 線性表
    • 線性表就是數據排成像線一樣的結構。每個線性表最多隻有前和後兩個方向。
    • 是線性表的數據結構有:
      • 數組
      • 隊列
      • 鏈表
  • 非線性表
    • 非線性表則與線性表相反,數據並不是簡單的前後關係。
    • 非線性表的數據結構有:
  • 連續的內存空間
    • 數組在內存中的存儲方式是一組給定長度的連續的空間。
    • 連續的空間才使得數組可以實現通過下標隨機訪問。
    • 高級語言中的數組能動態擴容均是二次封裝之後的結果,最底層的數據初始化的時候就已經指定好了該數組的長度。
  • 存儲相同類型的數據
    • 相同類型+連續空間使得數組可以通過下標隨機訪問。

數組的原理

數組示例

如圖所示,這是一個長度爲5的int數組arr,我們假設起始的內存地址爲1000,那麼第一個元素的內存地址範圍就是:1000-1003,這是因爲一個int佔4個字節。那麼如果我們想要訪問最後元素arr[4],我們可以很容易的通過起始地址計算出來,1000+4*4 = 1016。那麼最後一個元素就是內存地址1016-1019。這就是數組隨機訪問的原理,並且通過前面的算式,我們可以得出因爲數組下標訪問的計算與數組長度n無關,因此下標訪問的時間複雜度爲O(1)

數組的特點

  • 可以直接隨機訪問(依據下標訪問)其中的任意數據
  • 隨機訪問數據非常高效
  • 低效的插入和刪除

前兩點上面原理裏面已經解釋的很清楚了,這裏我們聊聊數組的插入與刪除。

因爲數組是一組連續的內存空間,那麼不管我們是要往裏面插入或者刪除,都必須涉及到數組插入、刪除節點之後的數據的移動。那麼最理想的情況:直接在數組末尾插入、刪除元素,時間複雜度爲O(1)。最差情況:在數組開啓插入、刪除元素,時間複雜度爲O(n)。因此數據的插入、刪除操作是非常低效的。

操作數組的小技巧

既然我們已經知道了數組插入、刪除的效率問題,那麼我們可以有一些小技巧來優化我們的操作。

  • 數組插入操作:如果我們要插入的數組是一個本身就無序的數組,那麼我們可以不需要將數據插到指定位置,直接插入末尾即可,這樣時間複雜度爲O(1),效率極高。
  • 數組刪除操作:如果我們有需求涉及到頻繁的刪除數組中的數據,因爲每次刪除都會造成數據的移動,非常的消耗性能,我們可以先記錄下已經刪除的數據,而不是真正的從數組中刪除,當數組空間不夠時或者刪除操作全部執行完之後,再一次性的刪除全部對應的數據並移動剩餘數據,這樣大大減少了數據 搬移的次數,提高執行效率。(這也是JVM標記清除垃圾回收算法的核心思想)

歡迎大家關注我的個人博客:http://blog.geek-scorpion.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章