記錄下算法圖解中介紹的一些數據結構算法
1、數組數組
初始化數組的時候,分配的內存是連續的,因此數組中全部的元素均可以經過初始元素的地址加上索引獲取對應的值。因此查詢的時候很快,是O(1)緩存
可是插入和刪除的時候就比較慢。數據結構
由於插入的時候須要判斷這段連續的內存空間夠不夠用,若是不夠,那麼須要從新申請新的內存空間,而後將舊數據移動到新內存中,插入數據。函數
若是夠,那麼須要將插入位置以後的元素都向後移動一格,騰出空間來插入新的元素。索引
刪除的時候須要將刪除位置以後的元素都向前移動一個,收縮空間。隊列
因此插入和刪除的時候是O(n)內存
2、鏈表效率
鏈表和內存不一樣,它不要求分配連續的地址。只須要足夠的空間就行。二叉樹
鏈表中除了末尾元素,其餘元素會額外保存下個元素的地址(針對單鏈表而言,雙鏈表的話還須要保存上個元素的地址)
那麼在查詢的過程當中,鏈表就會比較慢,由於須要遍歷每一個元素,直到找到指定位置的元素。查詢的時候是O(n)
可是插入和刪除的時候很快
假設鏈表是這樣的a->c->d
咱們想在c以前插入b,那麼咱們須要,將b的下個元素地址指向(a指向的下個元素地址)c的地址,將a指向的下個元素地址改成b的地址便可。
刪除的時候也是同樣的 a->b->c
若是要刪除b,須要只須要將a的下個元素地址指向c便可。
因此插入和刪除的時候是O(1)
可是我感受其實不是的,插入的時候,要找到插入位置的地址,這個其實也須要從頭開始找(不管是單鏈表仍是雙鏈表,在插入的時候都要從頭開始)。找到指定位置以後才改變指向元素地址。
刪除的時候也是,若是也仍是要找到指定位置次啊能改變指向元素地址。
理論上是O(1),但實際上極可能不是
3、棧(堆棧)
棧是一種後進先出的數據結構,後進先出是其最大的特色。只能將元素添加到棧頂,而且只能刪除棧頂元素(只支持入棧和出棧)
插入元素時,將元素加入到棧頂,刪除元素時,先刪除棧頂元素。
其實跟洗盤子同樣,將盤子一個個疊起來,後面的盤子要放在以前盤子的上面,洗盤子的時候,先洗上面的盤子。最後放的盤子會優先被洗掉。
不少語言中都使用到了棧,如函數的調用。函數a調用了函數b,函數b調用了函數c。
a在棧尾,調用b時,將b入棧,放到棧頂,b調用c時,將c入棧,放到棧頂。c函數執行結束,將c出棧。只剩a和b,b調用結束,將b出棧,只剩a。
實際生活中棧的使用不少。
4、散列表
哈希表其實就是散列表的一種,只是散列函數使用了哈希函數而已。
散列表經過關鍵字來執行查詢,插入和刪除操做。
散列表跟數組同樣,申請一段連續的內存空間。經過散列函數(一般是哈希),將關鍵字轉化爲索引。
假設散列表申請了8塊連續的內存空間,索引從1-7。散列函數會將關鍵字轉爲0-7以前的數值,而後將值存放在相應的地址。
其實和數組差很少,不過是數組直接經過索引來查詢,而散列表多了一步,多了將關鍵字轉化爲索引這個步驟。
散列表中最重要的部分就是散列函數了。
散列函數須要知足如下條件
一、散列函數老是將相同的輸入映射到相同的索引,若是映射到不一樣的索引,那麼每次獲取的值都不一樣,明顯不對。
二、散列函數將不一樣的輸入映射到不一樣的索引,若是不一樣輸入映射到不一樣索引,後面的映射會覆蓋前面的映射,明顯也不對。
三、散列函數須要知道數組的大小,只返回有效的索引。以上述爲例,散列函數只能返回0-7之間的數值。
散列表有不少重要做用,如查詢,防止重複,以及緩存等等。
查詢的時候,將關鍵字散列成索引,取值,利用數字的查詢優點,快速取值。效率爲O(1)
防止重複,將關鍵字散列成索引,取值,若是值存在,說明存在重複
緩存,其實就是利用查詢快的優勢,先將一些經常使用的信息放到散列表中。使用的時候先去散列表中去,若是散列表中存在,就直接返回,若是不存在再經過其餘途徑取。由於散列表查詢速度快,因此能夠這麼作。
散列表很好用,可是也要注意如下幾點
一、填裝因子(即已使用的內存佔未使用內存的比例)
假設總大小爲10, 使用了3,那麼就是十分之三。
若是裝填因子太大,說明內存被大量使用,後續極可能不夠用了。咱們須要預先分配新的內存,下降裝填因子。通常大於0.7就須要擴容。
二、良好的散列函數
上面說過,散列表重要的部分就是散列函數,除了要知足上述三種要求以外,散列表應該能讓數組中的值均勻分佈。若是每次都將關鍵字轉爲0或者1,那麼常常會致使衝突。這就是很差的散列函數。
5、隊列
隊列是一種先進先出的數據結構,先進先出是其最大的特色。恰好跟棧相反。(只支持入隊和出隊)
添加元素時,將元素入隊,放到隊尾。刪除元素時,將隊頭元素出隊。
跟平常排隊同樣,加入隊列時,須要排到隊伍末尾,隊頭元素先出隊。
6、圖
圖是一種多對多的數據結構,由節點和邊組成。一個節點可能於衆多節點直接相連,這些節點被稱爲鄰居。
按邊是否有方向,圖分爲有向圖和無向圖兩種
有向圖,顧名思義,就是有方向的圖,a到b存在箭頭,那麼a能夠到達b,可是b不必定能到達a
無向圖,其實就是雙向圖。a到b存在路線,那麼a能夠到b,b也能夠到a。
按邊是否有權重,圖分爲加權圖和非加權圖
7、樹
樹是一種單對多的數據結構。最經常使用的是二叉樹