學習極客時間資料結構與演算法之美總結
陣列是在記憶體上連續的記憶體空間。
陣列隨機查詢演算法複雜度為o(1),但是插入和刪除都為o(n)(這個要看情況,要是資料不是按照順序的話,那麼直接把目標位置替換成新的值,然後將舊的值放到最後,這樣演算法複雜度依然為o(1),刪除的時候把刪除的地方做標記,等到空間不足的時候再將所有刪除的地方全部移除,其他元素進行前移,這樣演算法效率同樣有提公升,有點像jvm的標記**法)
由於記憶體的碎片化很可能造成沒有足夠的連續空間給新的陣列,這樣造成oom異常。
陣列長度不夠用的時候動態擴容,是申請乙個更大的陣列,然後將原來的陣列資料複製進去。
鍊錶分為單向鍊錶、雙向鍊錶、迴圈鍊錶、雙向迴圈鍊錶。
鍊錶靠著指標之鄉前(後)資料,這樣就意味著不需要連續的空間,零散的空間就可以使用了,但是會占用空間來存放指標。
單向鍊錶只有乙個向後的指標,頭節點、尾節點,頭節點是鍊錶的開頭,尾節點向後的指標為null。
單向鍊錶遍歷(查詢)的時間複雜度為o(n),插入和刪除的時間複雜度是o(1)(這個要看情況,如果已經在要刪除的位置了,那麼時間複雜度是o(1),但是如果沒有在要刪除的位置的話,那麼還需要遍歷尋找,這樣時間複雜度還是o(n))。
雙向鍊錶不僅有乙個向後的指標,還有乙個向前的指標。
雙向鍊錶遍歷查詢的時間複雜度為o(n),插入和刪除的時間複雜度是o(1)(這個也要看情況,具體與單向鍊錶類似)。
其與單向鍊錶優點是在插入刪除的時候,因為要更改前面乙個節點的後向指標,但是單向鍊錶如果當時沒有進行記錄的話,需要從頭進行查詢,這樣時間複雜度是o(n),但是雙向鍊錶因為有著前向指標,所以時間複雜度是o(1),缺點是需要額外的空間儲存前向指標在查詢的時候,如果鍊錶是有序的話,那麼可以儲存當前的查詢的位置,然後下次查詢的時候可以與這次位置比較,根據大小和鍊錶的排序情況,選擇前向和後向運動查詢,這樣時間效率更高。
迴圈鍊錶和雙向迴圈鍊錶有著類似的結構,就是頭和尾相連,具體還沒有體會其用法,等之後再進行補充。
反轉鍊錶(
鍊錶中環的檢測
兩個有序的鍊錶合併
刪除鍊錶倒數第 n 個結點
求鍊錶的中間結點
資料結構與演算法 鍊錶(1)
最近一直在看 劍指offer 這本書,現在總結一下對於鍊錶方面的一點認識。鍊錶的結構很簡單,它由指標把若干個結點連成鏈狀結構。鍊錶的基本操作包括 建立 插入結點 刪除結點等。鍊錶是一種動態儲存結構,在建立鍊錶的時候無需知道鍊錶的長度,當插入乙個結點時,我們只需要為新插入的節點分配記憶體,然後調整指標...
資料結構 陣列與鍊錶
陣列的特點 1.在記憶體中,陣列是一塊連續的區域 2.陣列需要預留空間,在使用前需要提前申請所佔記憶體的大小,不知道需要多大的空間,可能會浪費記憶體空間,即陣列空間利用率低 3.在陣列起始位置處,插入資料和刪除資料效率低。插入資料時,待插入位置的的元素和它後面的所有元素都需要向後搬移 刪除資料時,待...
資料結構與演算法 陣列與鍊錶(一)
定義 陣列是一種用一片連續的記憶體空間來儲存一組相同型別的資料的線性表結構。連續的記憶體空間 這個特點,決定了陣列支援隨機訪問的特性。計算機通過位址來訪問記憶體中的資料,陣列在記憶體中存放的是它的首位址,一維陣列的定址公式為a i add ress bas eadd ress i s izeo f ...