演算法 資料結構篇 陣列和鍊錶

2021-10-06 10:17:52 字數 2221 閱讀 5496

演算法和資料結構都是非常基礎的內容,經常使用,但是又很容易被忽視,而被重視的時候往往是面試官提問的時候。之前很不理解為什麼面試官總喜歡問演算法和資料結構,日常價值不大的東西。後來隨著工作的深入,越發的理解 

演算法+資料結構=程式

之所以後來理解了這個公式,系統學過演算法和資料結構的知識,清楚的知道它們代表什麼,才能有自身真正體會。

什麼是資料結構?

是資料的組織,管理和儲存格式,其目的為了更高效地訪問和修改資料。資料結構是演算法的基石

常見的資料結構有

1、線性結構

陣列,鍊錶,基於它們衍生的棧,佇列,雜湊表等

2、樹相對複雜的資料結構,代表二叉樹

3、圖更為複雜的資料結構,因為圖中有很多關聯關係

什麼是演算法?

在數學領域裡,演算法是用於解決某一類問題的公式和思想。在電腦科學領域,本質是一系列程式指令,用於解決特定的運算和邏輯問題。演算法的應用多種多樣。例如下面,包含又不僅僅下面這些

1、運算

2、查詢

3、排序

4、最優決策

結合日常的開發過程,我們通常做的就是也就是這些內容了。即程式的組成部分包含演算法

程式的衡量標準通常是時間和空間,一般開發業務都會要求響應速度,這是為了客戶體驗度。其次空間占用,決定企業需要承擔成本。從程式對應到演算法上,同樣適用,所以衡量演算法的兩個標準同程式。

時間複雜度——計算方式基本操作執行次數

每個演算法的執行次數,對應就能轉換成耗費時長。通常時間複雜度是o(1) o(logn) o(n) o(n²) o(nlogn)o(n³) o(mn) o(2^n)o(n!)等

空間複雜度——執行過程中臨時占用儲存空間大小

舉個例子n個數中找到2個重複的整數。

有很多中實現方案,最簡單的就是雙重迴圈,每遍歷到乙個新整數就開始回顧之前遍歷的所有整數,判斷之中是否有相等的數,這樣時間複雜度就是o(n²),空間複雜度o(1)。

另一種實現方案,每遍歷乙個數,將就乙個數存到陣列中,在比較的時候直接去陣列中去獲取,如果能得到則證明重複,此時時間複雜度為o(n),但是它占用空間使用了陣列,空間複雜度o(n)

時間與空間的取捨

上述例子就是典型的犧牲空間來換時間,在大部分情況下,時間複雜度更重要些,所以寧可多些記憶體,也要提公升速度。上述例子用,時間之所以提高,是因為我們使用陣列,陣列就是一種資料結構,而案例中方案一其實本質上使用的是陣列,同樣都是資料結構,但是空間複雜度卻不相同。所以空間複雜度是離不開資料結構的,而演算法和資料結構就是相親相愛的一家人,這樣才產生了愛的結晶——程式。

陣列有限個相同型別的變數所組成的有序集合,陣列中的每乙個變數被稱為元素。而且陣列還有乙個特點,是在記憶體中順序儲存,因此可以實現邏輯上的順序表,只要給出乙個陣列下標,就可以讀取到對應的陣列元素,根據下標讀取元素的方式——隨機讀取

讀取   時間複雜度o(1) 

插入,刪除 時間複雜度o(n) 因為涉及到陣列的插入、刪除前後的元素移動。   

優缺點優點   陣列擁有非常高效的隨機訪問能力,只要給出下標,就可以用常量時間找到對應元素。有一種高效查詢元素的演算法叫作二分查詢,即利用陣列該優勢。

缺點  在插入和刪除元素方面,由於陣列元素連續緊密地儲存在記憶體中,插入,刪除元素都會導致大量元素被迫移動,影響效率。

鍊錶

鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。

查詢 時間複雜度 o(n) 

插入\刪除 時間複雜度o(1) 因為鍊錶有指標,單純執行插入,刪除的過程,只需要將指標指向新的元素即可。

總結

演算法+資料結構=程式

關於程式通常由時間複雜度和空間複雜度兩種需要,但是兩者通常不能同時滿足,一般犧牲空間來減少耗時,而空間複雜度本質上等於資料結構。

陣列和鍊錶都屬於線性的資料結構,但是兩者使用場景各有不同,陣列的優勢在於快速定位元素,對於讀操作,寫操作少的場景來說,陣列更合適。相反鍊錶的優勢在於能夠靈活的進行插入和刪除操作,對於需要頻繁插入,刪除元素更合適些。

演算法 資料結構 鍊錶和哨兵節點

鍊錶是一種基礎的資料結構,但對於一些初學者來說,實現乙個鍊錶還是比較困難的,許多操作作用在頭部或尾部時需要特殊處理。比如下面這段 template typename t void linkedlist remove linkedlistnode node 上述 進行了兩次的空值判斷,有可能會更新煉表...

資料結構與演算法 陣列與鍊錶(一)

定義 陣列是一種用一片連續的記憶體空間來儲存一組相同型別的資料的線性表結構。連續的記憶體空間 這個特點,決定了陣列支援隨機訪問的特性。計算機通過位址來訪問記憶體中的資料,陣列在記憶體中存放的是它的首位址,一維陣列的定址公式為a i add ress bas eadd ress i s izeo f ...

演算法 陣列和鍊錶

注 本文僅為筆記。原文 一維陣列記憶體定址公式 對於二維陣列 a n a i addr base addr i type size 二維陣列記憶體定址公式 對於二維陣列 a m n a i j addr base addr i n j type size 三維陣列記憶體定址公式 對於三維陣列 a m...