經典演算法總結

2022-08-22 01:39:13 字數 3741 閱讀 2971

一 緒論

1 最大連續子陣列:給定乙個陣列,求它的連續子陣列,使得該子陣列的和最大

解法:(1)暴力法

(2)分治法

(3)分析法

(3)動態規劃法

2 查詢旋轉陣列的最小值

3 零子陣列

4 lcs(最長公共子串行):兩個序列x和y的公共子串行中,長度最長的那個,定義為x和y的最長公共子串行

lcs可以描述兩段文字之間的「相似度」

解法:(1)窮舉法

(2)動態規劃法

5 lcs的應用:最長遞增子串行lis:給定乙個長度為n的陣列,找出乙個最長的單調遞增子串行

解法:(1)使用lcs解lis

(2)動態規劃方法

二 字串

1 字串迴圈左移:給定乙個給定乙個字串,要求把s的前k個字元移動到s的尾部,如把字串「abcdef」前面的2個字元『a』『b』移動到字串的尾部,得到新字串「cdefab」

解法:(1)暴力移位法

(2)(x』y』) = yx

2 字串的全排列:給定字串s[0…n-1],設計演算法,列舉s的全排列

3 kmp演算法:kmp演算法是一種線性時間複雜度的字串匹配演算法,它是對bf(暴力求解)演算法的改進

4 dfa和nfa:以當前位置為dfa的狀態,以模式串的字元為dfa的轉移條件,建立確定有窮自動機

dfa的五要素:

非空有限的狀態集合q

 輸入字母表σ

 轉移函式δ

 開始狀態s

 結束狀態f

5 kmp應用:powerstring問題:給定乙個長度為n的字串s,如果存在乙個字串t,重複若干次t能夠得到s,那麼,s叫做週期串,t叫做s的乙個週期。如:字串abababab是週期串,abab、ab都是它的週期,其中,ab是它的最小週期。設計乙個演算法,計算s的最小週期。如果s不存在週期,返回空串

6 求字串的最長回文子串:該演算法的要求,是求字串中最長的那個回文子串

7 manacher演算法和bm演算法

三 陣列

1 尋找和為定值的兩個數:輸入乙個陣列a[0…n-1]和乙個數字sum,在陣列中查詢兩個數ai,aj,使得ai+aj=sum

解法:(1)暴力法

(2)利用hash結構求解

2 hash函式:hash函式在hash結構設計中居於核心地位。乙個好的hash函式,能夠將資料對映到「雜亂」的位置

三個經典hash函式:

 dbj2

 sdbm

 murmurhash

3 分支限界法

4 荷蘭國旗問題:現有紅、白、藍三個不同顏色的小球,亂序排列在一起,請重新排列這些小球,使得紅白藍三色的同顏色的球在一起。這個問題之所以叫荷蘭國旗,是因為我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗

5 完美洗牌演算法:長度為2n的陣列,經過整理後變成,要求時間複雜度o(n),空間複雜度o(1)

四 樹

1 二叉查詢樹:二叉查詢樹(二叉搜尋樹)是滿足以下條件的二叉樹

 左子樹上的所有節點值均小於根節點值

 右子樹上的所有節點值均不小於根節點值

 左右子樹也滿足上述兩個條件

二叉樹的遍歷:

前序遍歷:  訪問根節點  前序遍歷左子樹  前序遍歷右子樹

中序遍歷:  中序遍歷左子樹  訪問根節點  中序遍歷右子樹

後序遍歷:  後序遍歷左子樹  後序遍歷右子樹  訪問根節點

2 平衡二叉樹:平衡二叉樹要求對於每乙個節點來說,它的左右子樹的高度之差不能超過1,如果插入或者刪除乙個節點使得高度之差大於1,就要進行節點之間的旋轉,將二叉樹重新維持在乙個平衡狀態

3 2-3-4樹和b樹

五 鍊錶、棧與遞迴

1 鍊錶相加:給定兩個鍊錶,分別表示兩個非負整數。它們的數字逆序儲存在鍊錶中,且每個結點只儲存乙個數字,計算兩個數的和,並且返回和的煉表頭指標

2 鍊錶的部分翻**給定乙個鍊錶,翻轉該鍊錶從m到n的位置。要求直接翻轉而非申請新空間

3 鍊錶劃分:給定乙個鍊錶和乙個值x,將鍊錶劃分成兩部分,使得劃分後小於x的結點在前,大於等於x的結點在後。在這兩部分中要保持原煉表中的出現順序

4 排序鍊錶中去重:給定排序的鍊錶,刪除重複元素,只保留重複元素第一次出現的結點

5 由lca引出指標和遞迴問題:最近公共祖先(lowest common ancestor,lca):給定一棵樹 t 和兩個結點 u 和 v,找出 u 和 v 離根結點最遠的公共祖先

6 單鏈公共結點問題

7 括號匹配:給定字串,僅由"(){}"六個字元組成。設計演算法,判斷該字串是否有效

 括號必須以正確的順序配對,如:"()"、"()" 是有效的,但"([)]"無效

8 最長括號匹配:給定字串,僅包含左括號』(『和右括號』)』,它可能不是括號匹配的,設計演算法,找出最長匹配的括號子串,返回該子串的長度。如:"(()":2,"(()())":6

9 逆波蘭表示式rpn

10 直方圖矩形面積:給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都為1;試找出直方圖中最大的矩形面積。如:給定高度為:2,1,5,6,2,3,最大面積為10

11 另乙個直方圖例題:收集雨水問題:給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都為1。若使用這樣形狀的容器收集雨水,可以盛多少水量

 如輸入:0,1,0,2,1,0,1,3,2,1,2,1 返回6

六 圖論

1 圖的遍歷和搜尋-廣度優先遍歷bfs

2 單詞變換問題:給定字典和乙個起點單詞、乙個終點單詞,每次只能變換乙個字母,問從起點單詞是否可以到達終點單詞?最短多少步?

3 圖的遍歷和搜尋-深度優先搜尋dfs

4 八皇后問題:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種解法

5 lca-tarjan演算法

6 最短路徑spf

7 floyd演算法:floyd演算法又稱為插點法,是一種用於尋找給定的加權圖中多源點之間最短路徑的演算法。該演算法名稱以創始人之一、2023年圖靈獎獲得者羅伯特·弗洛伊德命名

8 帶負權的最短路徑bellman-ford演算法

9 最小生成樹mst:最小生成樹要求從乙個帶權無向完全圖中選擇n-1條邊並使這個圖仍然連通(也即得到了一棵生成樹),同時還要考慮使樹的權最小。最小生成樹最著名演算法是prim演算法和kruskal演算法

最常見的兩種演算法:

 prim演算法  kruskal演算法

9 拓撲排序

七 貪心法與動態規劃

經典排序演算法總結

排序演算法是離散數學和資料結構學科最基本的演算法,雖然知道這些排序演算法的名字,但是一直沒有研究過它們的實現原理。現在把它們收集起來,並一一親自實現,來加深對排序演算法的理解。1,氣泡排序 最簡單的排序演算法,從第乙個元素開始比較相鄰元素大小,如果前邊元素大於後邊元素則交換位置,否則將下標移到下乙個...

經典排序演算法總結

插入排序 選擇排序 歸併排序 排序方法 平均情況 最好最差 空間複雜度 穩定性氣泡排序o n2 o n 2 o n o n o n2 o n 2 o 1 o 1 穩定快速排序o nlogn o nlog n o nlogn o nlog n o n2 o n 2 o nlogn o nlog n 不...

各種經典演算法總結

二分排序 二分查詢 演算法思想 1 將陣列排序 從小到大 2 每次跟中間的數mid比較,如果相等可以直接返回,如果比mid大則繼續查詢大的一邊,否則繼續查詢小的一邊。輸入 排序好的陣列 ssource,陣列大小 array size,查詢的值 key 返回 找到返回相應的位置,否則返回 1 int ...