算法章节 递归、排序、⼆分查找
生活随笔
收集整理的這篇文章主要介紹了
算法章节 递归、排序、⼆分查找
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
遞歸
| 概念與特性 | 函數(shù)調(diào)?函數(shù)?身的編程?式叫做遞歸,調(diào)?為”遞“,返回為”歸“ |
| 三個條件 | 1. ?個問題的解可以分解為多個?問題的解; 2. 分解之后的?問題,除了數(shù)據(jù)規(guī)模不同,求解思路跟原問題相同; 3. 存在遞歸終?條件; |
| 編程技巧 | 1. 尋找將?問題分解為?問題求解的規(guī)律; 2. 找出遞推公式和終?條件,將其直接翻譯成代碼; 3. 切記不要???層?層的遞歸; 換句話說,也就是:如果?個問題A可以分解為若??問題B、C、D,我們可以假設(shè)?問題B、C、D已經(jīng)解決,在此基礎(chǔ)上思考如何解決問題A。 我們只需要思考問題A與?問題B、C、D兩層之間的關(guān)系即可,不需要?層?層往下思考?問題與??問題,??問題與???問題之間的關(guān)系。 ? |
| 應(yīng)?場景 | 遞歸是?種應(yīng)??常?泛編程技巧,很多數(shù)據(jù)結(jié)構(gòu)和算法的編碼實現(xiàn)都要 ?到遞歸,?如快排、歸并排序、DFS(深度優(yōu)先搜索算法)、?叉樹遍歷、回溯等; |
| 其他知識點 | 1. 避免堆棧溢出(限制調(diào)?層次;遞歸改為迭代;尾遞歸優(yōu)化); 2. 避免重復(fù)計算(利?備忘錄); |
| 掌握程度 | 1. 熟練編寫斐波那契數(shù)列、全排列、?皇后、快速排序;歸并排序、DFS、?叉樹遍歷、鏈表反轉(zhuǎn)遞歸實現(xiàn)等; |
排序
| 概念與特性 | 1. 穩(wěn)定性:如果待排序的序列中存在值相等的元素,經(jīng)過排序之后,相等元素之間原有的先后順序不變; 2. 原地:不額外申請?常量級的空間來臨時存儲排序數(shù)據(jù);原地排序算法并不?定空間復(fù)雜度是O(1),空間復(fù)雜度是O(1)的排序算法?定是原地排序算法,?如快速排序是原地排序算法,但因為?到遞歸,函數(shù)調(diào)?棧會消耗?常量級的空間,所以,空間復(fù)雜度并?O(1),是O(logn)。 | |
| O(n^2) | 冒泡排序 | 冒泡排序是穩(wěn)定原地排序算法。 整個冒泡排序過程包含多遍冒泡操作。每次冒泡操作都會遍歷整個數(shù)組,依次對相鄰的元素進??較,看是否滿???關(guān)系要求,如果不滿?,就將它們互換位置。?次冒泡操作會讓?少?個元素移動到它應(yīng)該在的位置,重復(fù)n次,就完成了n個數(shù)據(jù)的 排序?作。 |
| 插?排序 | 插?排序是穩(wěn)定原地排序算法。?先,我們將數(shù)組中的數(shù)據(jù)分為兩個區(qū)間,已排序區(qū)間和未排序區(qū)間。初始已排序區(qū)間只有?個元素,就是數(shù)組中的第?個元素。插?算法的核?思想是取未排序區(qū)間中的元素,在已排序區(qū)間中找到合適的插?位置將其插?,并保證已排序區(qū)間數(shù)據(jù)?直有序。重復(fù)這個過程,直到未排序區(qū)間中元素為空,算法結(jié)束。 | |
| 選擇排序 | 選擇排序算法是?穩(wěn)定原地排序算法。其實現(xiàn)思路有點類似插?排序,也分已排序區(qū)間和未排序區(qū)間。 但不同點在于,選擇排序算法每次會從未排序區(qū)間中,找到最? 的元素,將其放到已排序區(qū)間的末尾。 | |
| O(nlogn) | 快速排序 | 快速排序是?穩(wěn)定原地排序算法。空間復(fù)雜度是O(logn)。 如果要排序數(shù)組中下標從p到r之間的?組數(shù)據(jù),我們選擇p到r之 間的任意?個數(shù)據(jù)作為pivot(分區(qū)點),然后,遍歷p到r之間 的數(shù)據(jù),將?于pivot的放到左邊,將?于pivot的放到右邊,將 pivot放到中間。經(jīng)過這?步驟之后,p到r之間的數(shù)據(jù)就被分成 了三個部分。假設(shè)pivot現(xiàn)在所在位置的下標是q,那p到q-1之 間數(shù)據(jù)都?于pivot,中間是pivot,q+1到r之間的數(shù)據(jù)都?于 pivot。根據(jù)分治、遞歸的處理思想,我們遞歸排序下標從p到 q-1之間的數(shù)據(jù)和下標從q+1到r之間的數(shù)據(jù),直到區(qū)間縮?為 1,就說明所有的數(shù)據(jù)都有序了。 遞推公式:quickSort(p…r)=quickSort(p…q-1) & quickSort(q+1…r) |
| 歸并排序 | 歸并排序是穩(wěn)定?原地排序算法。空間復(fù)雜度是O(n)。 如果要排序?個數(shù)組,我們先把數(shù)組從中間分成前后兩部分,然后,對前后兩部分分別排序,再將排好序的兩部分合并在?起,這樣整個數(shù)組就都有序了。遞推公式:mergeSort(p…r)=merge(mergeSort(p…q), mergeSort(q+1… r)) | |
| O(n) | 桶排序 | 桶排序,顧名思義,會?到“桶”,核?思想是將要排序的數(shù)據(jù)分到?個有序的桶?,每個桶?的數(shù)據(jù)再單獨進?排序。桶內(nèi)排完序之后,再把每個桶?的數(shù)據(jù)按照順序依次取出,組成的序列就是有序的了。要排序的數(shù)據(jù)需要很容易就能劃分成m個桶,并且,桶與桶之間 有著天然的??順序。這樣每個桶內(nèi)的數(shù)據(jù)都排完序之后,桶與桶之間的數(shù)據(jù)不需要再進?排序。 |
| 計數(shù)排序 | 實際上,計數(shù)排序是桶排序的?種特殊情況。當要排序的n個數(shù)據(jù),所處的范圍并不?的時候,?如最?值是k,我們就可以把數(shù)據(jù)劃分成k個桶。每個桶內(nèi)的數(shù)據(jù)值都是相同的,省掉了桶內(nèi)排序的時間。 | |
| 基數(shù)排序 | 基數(shù)排序?qū)σ判虻臄?shù)據(jù)也是有要求的,需要可以分割出獨?的“位”來?較,?且位之間有遞進的關(guān)系:如果a數(shù)據(jù)的?位? b數(shù)據(jù)?,那剩下的低位就不??了。除此之外,每?位的數(shù) 據(jù)范圍不能太?,可以使?其他線性排序算法來排序,否則,基數(shù)排序的時間復(fù)雜度就?法做到O(n)了。 | |
| 應(yīng)?場景 | ?程中的排序函數(shù)?般使?O(nlogn)的快排、歸并或者堆排序作為主排序算 法,當數(shù)據(jù)規(guī)模較?時,轉(zhuǎn)?選擇使?更加簡單的插?排序。 | |
| 其他知識點 | 為了避免快速排序時間復(fù)雜度退化為極端情況O(n^2),我們使?更加?級的 分區(qū)點選擇?式,?如三數(shù)取中法、隨機法等。 | |
| 掌握程度 | 1. 熟練掌握冒泡、插?、選擇、快速、歸并排序的原理、代碼實現(xiàn); 2. 熟練掌握快速、歸并排序的時間和空間復(fù)雜度分析; 3. 掌握桶排序、計數(shù)排序、基數(shù)排序的原理 | |
?分查找
| 概念與特性 | ?分查找針對的是?個有序的數(shù)據(jù)集合,查找思想有點類似分治思想。每次都通過跟區(qū)間的中間元素對?,將待查找的區(qū)間縮?為之前的?半,直到找到要查找的元素,或者區(qū)間被縮?為0。 |
| 操作與復(fù)雜度 | ?分查找的時間復(fù)雜度是O(logn) |
| ?分查找變體 | 變體?:查找第?個值等于給定值的元素 變體?:查找最后?個值等于給定值的元素 變體三:查找第?個?于等于給定值的元素 變體四:查找最后?個?于等于給定值的元素 |
| 掌握程度 | 熟練掌握?分查找、?分查找變體的代碼實現(xiàn) |
相關(guān)圖片
?
參考鏈接
- 菜鳥教程
總結(jié)
以上是生活随笔為你收集整理的算法章节 递归、排序、⼆分查找的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解Solidity 二
- 下一篇: 关于锁的注意事项