數據結構之簡單的數組
?作為一個技術博主,了不起不是在創作就是在創作的路上(當然偶爾也會有點恰飯文~還指望大家多多支持),我們都知道,在寫代碼的過程中,很多時候能夠用到這個數據結構,而大廠在面試的時候也是各種強調自己要求數據結構如何如何的,然后通過問關于數據結構的面試題來篩選面試者,那么今天了不起就來盤一下這個數據結構。
什么是數據結構
百度百科是這么解釋的:
數據結構(data structure)是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。
其實我們總結一下的話,那真的太簡單的,存在內存的,而且是用來存數據的,它就可以理解為數據結構。
數據結構的分類
我們在開發中,也都經常的用到數據結構,只是不是很在意這個名詞,而是直接使用他們的另外的說法,比如:
- 數組
- 鏈表
- 堆
- 棧
上面的這四個數結構,可以統稱為線性表。而除了線性表,我們還有其他的數據結構,比如散列表,樹,還有圖。
散列表有:
- hash
- 位圖
樹有:
- 二叉樹
- 多路樹
- 堆
圖包含:
- 有向圖
- 無向圖
- 帶權圖
我們今天也別分析太多的內容,我們從最熟悉的入手,那么什么是我們最熟悉的呢?毫無疑問,那就是線性表中的內容,因為 數組,鏈表,堆,棧,這都是我們經常會在面試中遇到的,而且也是在代碼中經常能夠看到的,而有的同學會說,根本沒用過,那這就是有點不太理解了,畢竟你用的都是上層的封裝類,而不是具體的底層。
我們先說數組:
數組
數組(Array)是有限個相同類型的變量所組成的有序集合,數組中的每一個變量被稱為元素。數組是 最為簡單、最為常用的數據結構。
數組都是用一組連續的內存空間來存儲一組具有相同類型的數據。
也就是在我們的內存中位置,都是緊挨著的,
就比如下圖,灰色標志的是被使用的內存,而紅色格子表示的就是數組占用的連續內存,而黃色格子表示的就是空閑的內存。
上面這個圖,就是數組在內存中的存儲空間示意圖,其實主要目的還是了不起想給大家說這個數組在內存中存儲的時候,是一個連續的內存空間,不會出現隔一個格子出現一個。
而數組呢,可以根據下標隨機訪問數據,其實說隨機,而此隨機非彼隨機。
他說隨機,也只是說隨機元素尋址,而不是說隨機取數據。
比如我們的 int 是 4 字節,也就是(32位),實際上內存存儲的是位
如果這時候隨機元素尋址的話,
采用隨機元素尋址,那么就是
那么我們就得知道這個操作這個數組的內存空間是都干了什么
第一步,讀取元素
第二步更新元素
讀取和更新都是可以隨機訪問的,時間復雜度大家可以猜測一下,歡迎在文章末尾回復。
那么插入元素的時候就會有三種情況了,尾部插入,中間插入,還有超范圍的插入。
那么什么是尾部插入呢?
尾部插入
其實尾部茶壺如是最簡單的實現方式,
在數據的實際元素數量小于數組長度的情況下:直接把插入的元素放在數組尾部的空閑位置即可,等同于更新元素的操作
中間插入
在數據的實際元素數量小于數組長度的情況下:由于數組的每一個元素都有其固定下標,所以首先把插入位置及后面的元素向后移動,騰出地方, 再把要插入的元素放到對應的數組位置上。
超范圍插入
假如現在有一個數組,已經裝滿了元素,這時還想插入一個新元素,或者插入位置是越界的 這時就要對原數組進行擴容:可以創建一個新數組,長度是舊數組的2倍,再把舊數組中的元素統 統復制過去,這樣就實現了數組的擴容。
那么使用數組的優缺點都有什么呢?
數組的優缺點
優點:
數組擁有非常高效的隨機訪問能力,只要給出下標,就可以用常量時間找到對應元素
缺點:
插入和刪除元素方面。由于數組元素連續緊密地存儲在內存中,插入、刪除元素都會導致大量元素被迫 移動,影響效率。(ArrayList LinkedList ) 申請的空間必須是連續的,也就是說即使有空間也可能因為沒有足夠的連續空間而創建失敗。
如果超出范圍,需要重新申請內存進行存儲,原空間就浪費了
一般的,數組是基礎的數據結構,應用太廣泛了,ArrayList、Redis、消息隊列等等,這些都是使用了數組這種數據結構,這種數據結構也是在面試的時候經常會和其他的數據結構拿出來做對比的,關于這個數據結構的數組,你學會了么?