《重學資料結構演算法》相關筆記(部分)

2021-10-07 05:07:05 字數 3065 閱讀 5064

複雜度

複雜度是衡量程式執行效率的方式。

複雜度是乙個關於輸入資料量 n 的函式。假設你的**複雜度是 f(n),那麼就用個大寫字母 o 和括號,把 f(n) 括起來就可以了,即 o(f(n))。例如,o(n) 表示的是,複雜度與計算例項的個數 n 線性相關;o(logn) 表示的是,複雜度與計算例項的個數 n 對數相關。

通常,複雜度的計算方法遵循以下幾個原則:

值得一提的是,o(1) 也是表示乙個特殊複雜度,含義為某個任務通過有限可數的資源即可完成。此處有限可數的具體意義是,與輸入資料量 n 無關。

用空間複雜度換時間複雜度

在程式優化中,需要讓時間和空間的消耗都降低,但是這通常是不容易做到的。我們可以認識到時間的成本是要比空間的成本高的,所以我們常採用空間換時間的方式。

降低時間複雜度的方式有:遞迴、二分法、排序演算法、動態規劃等。

降低空間複雜度的核心思路是:能用低複雜度的資料結構能解決問題,就千萬不要用高複雜度的資料結構。

降低複雜度的方法一般為下面三個步驟:

增刪查是實際應用中最基礎也是最常用資料結構操作方式。

線性表是 n 個資料元素的有限序列,最常用的是鏈式表達,通常也叫作線性鍊錶或者鍊錶。在鍊錶中儲存的資料元素也叫作結點,乙個結點儲存的就是一條資料記錄。每個結點的結構包括兩個部分:

線性表有:單向鍊錶,雙向鍊錶,單向迴圈鍊錶,雙向迴圈鍊錶等等。

例 快慢指標

判斷鍊錶是否有環。如下圖所示,這就是乙個有環的鍊錶

鍊錶的快慢指標方法,在很多鍊錶操作的場景下都非常適用,對於這個問題也是一樣。

假設鍊錶有環,這個環裡面就像是乙個跑步賽道的操場一樣。經過多次迴圈之後,快指標和慢指標都會進入到這個賽道中,就好像兩個跑步選手在比賽。#加**#快指標每次走兩格,而慢指標每次走一格,相對而言,快指標每次迴圈會多走一步。這就意味著:

根據這個性質我們就能對鍊錶是否有環進行準確地判斷了。如下圖所示:

棧是一種特殊的線性表。棧與線性表的不同,體現在增和刪的操作。具體而言,棧的資料結點必須後進先出。後進的意思是,棧的資料新增操作只能在末端進行,不允許在棧的中間某個結點後新增資料。先出的意思是,棧的資料刪除操作也只能在末端進行,不允許在棧的中間某個結點後刪除資料。

巨集觀上來看,與陣列或鍊錶相比,棧的操作更為受限,那為什麼我們要用這種受限的棧呢?其實,單純從功能上講,陣列或者鍊錶可以替代棧。然而問題是,陣列或者鍊錶的操作過於靈活,這意味著,它們過多暴露了可操作的介面。這些沒有意義的介面過多,當資料量很大的時候就會出現一些隱藏的風險。一旦發生** bug 或者受到攻擊,就會給系統帶來不可預知的風險。雖然棧限定降低了操作的靈活性,但這也使得棧在處理只涉及一端新增和刪除資料的問題時效率更高。

瀏覽器的頁面儲存問題,就是乙個很好應用棧的例子。

棧有分為順序棧和鍊錶棧。

例 括號匹配

給定乙個只包括 『(』,』)』,』』,』[』,』]』 的字串,判斷字串是否有效。有效字串需滿足:左括號必須與相同型別的右括號匹配,左括號必須以正確的順序匹配。例如, 是合法的,而 是非法的。

與棧相似,佇列也是一種特殊的線性表,與線性表的不同之處也是體現在對資料的增和刪的操作上。

佇列的特點是先進先出:

略面試中的高頻考察點(字串匹配演算法)。

字串中通常使用順序結構。

樹:是由結點和邊組成的,不存在環的資料結構。

二叉樹:每個結點最多只有兩個分支。

雜湊表的核心思想:設計採用了函式對映的思想,將記錄的儲存位置與記錄的關鍵字關聯起來。這樣的設計方式,能夠快速定位到想要查詢的記錄,而且不需要與表中存在的記錄的關鍵字比較後再來進行查詢。這是一種**可以實現「位址 = f (關鍵字)」的對映關係,那麼就可以快速完成基於資料的數值的查詢了。**這就是雜湊表的核心思想。

如何設計雜湊函式

一些常用的設計雜湊函式的方法:

如何解決雜湊衝突

上面這些常用方法都有可能會出現雜湊衝突。那麼一旦發生衝突,我們該如何解決呢?

常用的方法,有以下兩種:

即當乙個關鍵字和另乙個關鍵字發生衝突時,使用某種探測技術在雜湊表中形成乙個探測序列,然後沿著這個探測序列依次查詢下去。當碰到乙個空的單元時,則插入其中。

常用的探測方法是線性探測法。 比如有一組關鍵字 ,採用的雜湊函式為 key mod 11。當插入 12,13,25 時可以直接插入,位址分別為 1、2、3。而當插入 23 時,雜湊位址為 23 mod 11 = 1。然而,位址 1 已經被占用,因此沿著位址 1 依次往下探測,直到探測到位址 4,發現為空,則將 23 插入其中。如下圖所示:

將雜湊位址相同的記錄儲存在一張線性鍊錶中。

例如,有一組關鍵字 ,採用的雜湊函式為 key mod 11。如下圖所示:

雜湊表優點:可以提供非常快速的插入-刪除-查詢操作,無論多少資料,插入和刪除值需要接近常量的時間。

雜湊表不足:在資料處理順序敏感的問題時,選擇雜湊表並不是個好的處理方法。同時,雜湊表中的 key 是不允許重複的,在重複性非常高的資料中,雜湊表也不是個好的選擇。

重學資料結構之演算法2 7

include 輸入輸出函式標頭檔案 include 記憶體申請函式標頭檔案 define list init size 100 define listincrement 10 typedef int elemtype typedef struct sqlist 操作結構,構造乙個空的線性表l vo...

重學資料結構與演算法(15 19)

我們前面學習的資料結構和演算法思維,是解決問題和 優化的基礎。本節課開始,我們進入實戰模組,從真正解決問題的角度來看看,如何將我們此前學到的知識靈活運用到實際工作中。加入我現在面對乙個實際的演算法題,我需要從以下兩個方面進行思考。首先,我們要明確目標。即用盡可能低的時間複雜度和空間複雜度,解決問題並...

演算法與資料結構 資料結構部分

1.資料結構基本概念 資料結構的基本概念 資料 資料元素 資料結構 資料的邏輯結構 物理結構 演算法等。資料 是對資訊的一種符號表示,是所有能輸入到計算機中並被電腦程式處理的符號的總稱 資料元素 是資料的基本單位,在電腦程式中通常作為乙個整體進行考慮和處理。有時稱為 元素,節點,頂點,記錄等 資料結...