資料結構與演算法 自底向上(1)隨機訪問與排序演算法

2021-10-07 14:06:02 字數 2669 閱讀 9360

1. 連續儲存

2. 非連續儲存

資料的各種儲存方式的意義在於支援增刪查改

缺點是每次儲存資料都需要佔據一整段連續的儲存空間,會造成記憶體空間的浪費。

不需要提前佔據整段的儲存空間,可以充分利用記憶體。

需要使用指標來將相關的儲存資料進行串聯。

所以為什麼時空複雜度分析在資料結構與演算法中尤為重要,因為時間與空間的協調與轉換是資料儲存與操作時需要考慮的最根本的問題。

定義:陣列(array)是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。

其中連續記憶體空間且相同資料型別,讓陣列能夠完全發揮連續儲存方式的一大優點,就是隨機訪問。在增刪查改的維度來總結陣列的特點的話就是:增刪低效(o(n)時間複雜度),查詢高效(o(1)時間複雜度)。

緊接著隨機訪問這一大特點,我想繼續聊一下根據這一特性延伸出來的排序演算法 先以最簡單的氣泡排序為例,該排序演算法的基本思想就是逐個兩兩比較然後通過交換index來移動元素,我們直接來看**。

// 氣泡排序,a表示陣列,n表示陣列大小

public

void

bubblesort

(int

a,int n)}if

(!flag)

break

;// 沒有資料交換,提前退出

}}

其中

int tmp = a[j];

a[j] = a[j+1];

a[j+1] = tmp;

交換語句就利用了隨機訪問的特性,但是氣泡排序僅僅是相鄰的元素交換,

對於隨機訪問的特性利用的還不明顯,我們再來看排序演算法中的經典演算法——快速排序

為了更加突出重點,我們只看其中移動元素的部分。

while

(left < right)

arr[left]

= arr[right]

;// 直到arr[right]小於切分點,放到切分點左側。

// 若左指標小於切分點,則右移left指標。

while

(left < right && arr[left]

<= pivot)

arr[right]

= arr[left]

;// 直到arr[left]大於切分點,放到切分點右側。

}// 切分點放到正確位置。

arr[left]

= pivot;

從快速排序中對於資料元素的index操作,可以更加直觀的感受到隨機訪問在排序演算法中的使用
鍊錶的簡單定義:使用指標將零散的記憶體塊串聯起來即為鍊錶

對比陣列這種資料結構,鍊錶的增刪是非常高效的為o(1)時間複雜度(單指增加節點與刪除節點的單純操作,不包括找到確切的增刪位置這一查詢過程),查詢操作為o(n)時間複雜度。

和前面對於陣列的討論一樣,我們來討論有關鍊錶這種資料結構的排序演算法,各類排序演算法基本上都應用了資料連續儲存方式的隨機訪問特性,而鍊錶資料結構並不具備這種特性。

我以leetcode148題(排序鍊錶為例,在眾多排序演算法中,歸併排序中對於隨機訪問的使用方式,是我們可以通過設定 「快慢指標」 來在鍊錶結構中達到相同的效果。

public listnode sortlist

(listnode head)

//通過快慢指標來尋找當前鍊錶的中位

listnode slow = head;

listnode fast = head.next;

while

(fast != null && fast.next != null)

//從中位將鍊錶切分

listnode p = slow.next;

slow.next = null;

//進入遞迴

listnode left =

sortlist

(head)

; listnode right =

sortlist

(p);

//開始合併操作

listnode guard =

newlistnode(0

);listnode tmp = guard;

while

(left != null && right != null)

else

tmp = tmp.next;

} tmp.next = left == null ? right : left;

return guard.next;

}

排序鍊錶這道題根本的解題思想就在於用 「快慢指標」 來模仿陣列這種資料結構在歸併排序中

使用 「隨機訪問」 的方式。

在我看來不同的資料結構的差異點就在於建立資料元素之間的聯絡的方式的不同,陣列通過

「定址公式」在連續儲存空間的條件下實際上對於每乙個資料元素之間都進行了直接的串聯(這裡的

直接串聯指可以不通過第三個元素直接進行訪問),這種做法屬於**「空間換時間」**。

而在鍊錶(基礎單鏈表)中,僅通過指標將前後資料元素進行串聯,從而降低了連續儲存空間的記憶體開銷

但是同時也使查詢時間增加,所以在後續的像「樹」這種資料結構,就是通過更多更豐富的指標來加強資料

元素之間的聯絡。

資料結構與演算法(1)

演算法 資料結構 一 演算法 1.演算法的幾個特徵是什麼。2.演算法複雜性的定義。大o 小o分別表示的含義。3.遞迴演算法的定義 遞迴演算法的兩要素。4.分治演算法的思想,經典的分治演算法 全排列 二分搜尋 歸併排序 快速排序 線性時間選擇 最接近點對問題 5.動態規劃演算法解題框架,動態規劃演算法...

資料結構與演算法(1)

1 線性表 2 棧 3 佇列 4 字串 補充 遞迴 1 樹與二叉樹 2 圖 1 查詢 2 排序 編寫相關演算法 資料結構 入門問題 1.為什麼學習資料結構?1 高階程式設計的理論指導 2 提公升編碼能力 3 面試中經常被問及,看發展潛力 2.有哪些資料結構?2.11線性結構 線性表 棧 佇列 陣列 ...

資料結構與演算法 1

cpu 處理器central process unit gpu 圖形處理器graphics processing unit,又稱顯示核心 視覺處理器 顯示晶元或繪圖晶元,是一種專門在個人電腦 工作站 遊戲機和一些移動裝置 如平板電腦 智慧型手機等 上執行繪圖運算工作的微處理器。其用途是將計算機系統所...