算法常識——基礎的數據結構

前言

在數據結構中,人們經常把把結構分爲物理結構和邏輯結構。
物理這個詞,咱們很容易想到材料。至於作門用木材仍是鐵塊,怎麼作,這就是邏輯了。
物理結構:順序存儲結構、鏈式存儲結構。
邏輯結構:線性結構:順序表、棧、隊列。非線性結構:樹,圖。c++

物理結構

順序存儲結構

咱們在學c++的時候接觸到一個東西,名字就叫作指針。指針存放的是指向的地址。
同時咱們知道存儲數據須要申請空間的,若是咱們申請一塊328byte的空間,用來連續存儲一些數據,這種稱爲順序存儲結構。
好比說數組就是典型的順序存儲結構,咱們通常去查找一個數組的具體某個值得時候,是這樣子的:arr[10],
爲何可以如此呢?咱們在肯定數組的時候,必定要肯定類型,肯定了內存就肯定了分配的空間,好比上面的arr[10]:
假設arr 是int32數組,arr[10]就是arr[0]偏移32
10。獲得的就是arr[10];
其實是每一個int 對於一個地址,好比說第一個是10091,而後第二個就是10092,以此類推。算法

鏈式存儲結構

和順序不一樣的就是,好比說第一個地址是10091,而後下一個的地址多是10092,也多是10900。
這樣有什麼好處呢?拿數組舉例,咱們發現咱們建立數組的時候,須要建立的必定要肯定個數。
這是爲啥呢?由於地址是連續的,因此說必須一次性申請好,比較咱們買電影連坐的時候通常都是一次性買好,否則你怎麼知作別人不要?
其中一個好處,就是能夠按需申請空間,通用能夠隨時添加,也能夠隨時刪除。
那麼一樣的擁有缺點,查詢的時候沒法經過索引查找。一樣保存好下一個的地址,一樣須要消耗空間。
在鏈式存儲結構中,有單鏈表,一樣也有雙鏈表。雙鏈表不只保存着next,一樣保存這pre,也就是前一個元素的地址。數組

邏輯結構

線性結構

線性結構,強調的是一維概念,單輸入單輸出,呈線性結構。
好比說棧,棧這種東西像什麼,好比說排隊,咱們一個一個進入,可是出去的時候呢,咱們從最後一個出來。
就是這麼回事。
而後對應的就是隊列了,什麼是隊列?從第一個進入,而後又從第一個出去,就是這麼一個概念。
至於散列表,這個是基於hash的,至關於數組與散列表的結合。
每一個對象計算出hashcode(hashcode 有多種計算的方法,也能夠本身設計),這個hashcode是可能衝突的,在此是假設惟一。好比說hashmap,hashmap基於一個數組,若是hashcode 是惟一的,那麼hashcode經過計算,假設是取餘hashode%arraylength,獲得數組的下標(注:這種算法有多種,只要計算數組不越界就行),可是確定會衝突啊,那麼根據索引找到的地方,其實是一個鏈表結果,而後遍歷鏈表找到。
以下圖:

由於散列表基於數組,那麼咱們在進入hashmap push的時候,咱們像是能夠無限循環同樣。
這個是如何作到的?
基於數組的擴容。
散列表擴容過程:
1.將數組擴容一倍。
2.而後從新hash計算。
這裏面能夠想象到擴容其實很消耗資源的,若是咱們能夠計算大致數量,能夠初始化數量的時候設定爲合適的參數。
固然如何設置不可理的話,默認擴大一倍,這壓力也是很大的,建議本身繼承改改,所謂的優化就是根據實際場合來優化,其餘都是套路。數據結構

非線性結構

非線性結構典型的就是樹與圖,這些都是數據結構中常見的。優化

相關文章
相關標籤/搜索