)
計算機算法核心知識點梳理個人學習筆記基礎 高頻考點目錄第一章 緒論1.1 什么是算法1.2 算法的描述1.3 算法的分析1.4重要的問題類型第2章 算法效率分析基礎第3章 蠻力法3.1 選擇排序和冒泡排序3.1.1選擇排序3.1.2 冒泡排序3.2 順序查找和蠻力字符串匹配3.2.1 順序查找3.2.2蠻力字符串匹配3.3 最近對和凸包問題的蠻力算法3.3.1 最近問題3.3.2 凸包問題3.4 窮舉查找3.5深度優先查找和廣度優先查找3.5.1 深度優先查找3.5.2 廣度優先查找第4章 減治法4.1 插入排序4.2 拓撲排序4.3生成祝賀對象的算法4.4 減常因子算法4.4.1 折半查找4.4.2 假幣問題4.4.3 俄式乘法4.4.4 約瑟夫斯問題4.5減可變規模算法4.5.1 插值查找第五章 分治法5.1 合并排序5.2 快速排序第一章 緒論1.1 什么是算法算法(algorithm)是一系列解決問題的明確指令也就是說對于符合一定規范的輸入能夠在有限時間內獲得要求的輸出。觀點可以認為算法是問題的程序化解決方案。1.2 算法的描述偽代碼(pseudocode)是自然語言和類編程語言組成的混合結構。偽代碼往往比自然語言更精確而且用偽代碼描述的算法往往會更簡潔。用箭頭代表賦值操作。1.3 算法的分析效率有兩種時間效率(time efficiency),指出算法運行有多快。空間效率(space efficiency),說明算法需要多少額外的存儲空間。1.4重要的問題類型排序問題(sorting problem)要求我們按照升序重新排列給定列表中的數據項。查找問題(searching problem)就是在給定的集合或者是多重集它允許多個元素具有相同的值)中找一個給定的值[我們稱之為查找鍵(search key)]。字符串處理也稱字符串匹配問題圖問題組合問題幾何問題類似于點、線、多面體這樣的幾何對象。數值問題(numerical problem)是另一個廣闊的具體應用領域涉及具有連續性的數學問題像解方程和方程組計算定積分以及求函數的值等。第2章 算法效率分析基礎不做筆記第3章 蠻力法蠻力法(brute force)是一種簡單直接地解決問題的方法常常直接基于問題的描述和所涉及的概念定義。3.1 選擇排序和冒泡排序3.1.1選擇排序3.1.2 冒泡排序3.2 順序查找和蠻力字符串匹配3.2.1 順序查找該算法只是簡單地將給定列表中的連續元素和給定的查找鍵進行比較直到遇到一個匹配的元素成功查找或者在遇到匹配元素前就遍歷了整個列表失敗查找)。實現順序查找時常常會使用這樣一個小技巧如果我們把查找鍵添加到列表的末尾那么查找就一定會成功所以不必在算法的每次循環時都檢查是否到達了表的末尾。以下是這個增強版本的偽代碼。3.2.2蠻力字符串匹配查找字符串第一個字符的位置請注意在這個例子中幾乎每做一次字符比較就要移動一次模式的位置。然而最壞的情況比這還要糟得多在移動模式之前算法可能會做足m次比較而n-m1次嘗試的每一次都可能會遇到這種情況。因此在最壞的情況下該算法屬于O(nm)。3.3 最近對和凸包問題的蠻力算法3.3.1 最近問題最近點對問題要求在一個包含n個點的集合中找出距離最近的兩個點。這種處理平面或者高維空間的鄰近點的問題在各種計算幾何問題當中是最簡單的。最近點對問題的一個最重要的應用是統計學中的聚類分析。3.3.2 凸包問題在平面或者高維空間的一個給定點集合中尋找凸包被視為計算幾何中最重要的問題之一。定義對于平面上的一個點集合有限的或無限的如果以集合中任意兩點p和q為端點的線段都屬于該集合我們說這個集合是凸的。凸包問題省略3.4 窮舉查找對于組合問題來說窮舉查找(exhaustive search)是一種簡單的蠻力方法。它要求生成問題域中的每一個元素選出其中滿足問題約束的元素然后再找出一個期望元素例如使目標函數達到最優的元素)。注意雖然窮舉查找的思想很簡單直接但在實現時它常常會要求算法來生成某些組合對象。常見問題旅行商問題背包問題分配問題3.5深度優先查找和廣度優先查找3.5.1 深度優先查找深度優先查找可以從任意頂點開始訪問圖的頂點然后把該頂點標記為已訪問。在每次迭代的時候該算法緊接著處理與當前頂點鄰接的未訪問頂點。如果有若干個這樣的頂點可以任意選擇一個頂點。但在實際應用中選擇哪一個鄰接的未訪問候選頂點主要是由表示圖的數據結構決定的。在我們的例子中我們總是根據頂點的字母順序來選擇頂點。)這個過程一直持續直到遇到一個終點一該頂點的所有鄰接頂點都已被訪問過。在該終點上該算法沿著來路后退一條邊并試著繼續從那里訪問未訪問的頂點。在后退到起始頂點并且起始頂點也是一個終點時該算法最終停了下來。這樣起始頂點所在的連通分量的所有頂點都被訪問過了。如果未訪問過的頂點仍然存在該算法必須從其中任一頂點開始重復上述過程。用一個棧來跟蹤深度優先查找的操作是比較方便的。在第一次訪問一個頂點時也就是說開始對該頂點的訪問時)我們把該頂點入棧當它成為一個終點時也就是說結束對該頂點的訪問時)我們把它出棧。深度優先查找樹depth-first search forest3.5.2 廣度優先查找按照一種同心圓的方式首先訪問所有和初始頂點鄰接的頂點然后是離它兩條邊的所有未訪問頂點以此類推直到所有與初始頂點同在一個連通分量中的頂點都訪問過了為止。如果仍然存在未被訪問的頂點該算法必須從圖的其他連通分量中的任意頂點重新開始。使用隊列注意它和深度優先查找的區別來跟蹤廣度優先查找的操作是比較方便的。該隊列先從遍歷的初始頂點開始將該頂點標記為已訪問。在每次迭代的時候該算法找出所有和隊頭頂點鄰接的未訪問頂點把它們標記為已訪問再把它們入隊。然后將隊頭頂點從隊列中移去。廣度優先查找森林breadth-first search forcest第4章 減治法4.1 插入排序我們考慮如何用減一技術對一個數組A[0.-1]排序。遵循該方法的思路我們假設對較小數組A[0.n-2]排序的問題已經解決了得到了一個大小為n-1的有序數組A0]≤…≤[n-2]。我們如何利用這個較小規模的解并將元素A[n-1]考慮進來來得到原問題的解呢顯然我們需要做的就是在這些有序的元素中為A[-1]找到一個合適的位置然后把它插入到那里。一般來說我們可以從右到左掃描這個有序的子數組直到遇到第一個小于等于A[-1]的元素然后把A[n-1]插在該元素的后面。這種算法被稱為直接插入排序(straight insertion sort),或者簡稱為插入排序(insertion sort)。4.2 拓撲排序4.3生成祝賀對象的算法4.4 減常因子算法以上略有時間再做筆記4.4.1 折半查找對于有序數組的查找來說折半查找是一種性能卓越的算法。它通過比較查找鍵K和數組中間元素A[m]來完成查找工作。如果它們相等算法結束。否則如果KA[m],就對數組的前半部分執行該操作如果KA[m],則對數組的后半部分執行該操作。4.4.2 假幣問題4.4.3 俄式乘法4.4.4 約瑟夫斯問題 三問題略4.5減可變規模算法4.5.1 插值查找有時間再做筆記第五章 分治法基本思想將一個規模為n的問題分解為k個規模較小的子問題這些子問題互相獨立且原問題相同。遞歸地解這些子問題然后將各子問題的解合并得到原問題的解。精髓分——將問題分解為規模更小的子問題。治——將這些規模更小的子問題逐個擊破。合——將已解決的子問題合并最終得到原問題的解。5.1 合并排序圖5.2演示的是用合并排序算法對數列8,3,2,9,7,1,5,4進行排序的操作過程。5.2 快速排序如何系統學習網絡安全/黑客網絡安全不是「速成黑客」而是守護數字世界的騎士修行。當你第一次用自己寫的腳本檢測出漏洞時那種創造的快樂遠勝于電影里的炫技。裝上虛擬機從配置第一個Linux環境開始腳踏實地從基礎命令學起相信你一定能成為一名合格的黑客。如果你還不知道從何開始我自己整理的282G的網絡安全教程可以分享我也是一路自學走過來的很清楚小白前期學習的痛楚你要是沒有方向還沒有好的資源根本學不到東西下面是我整理的網安資源希望能幫到你。需要的話可以V掃描下方二維碼聯系領取~如果二維碼失效可以點擊下方鏈接去拿一樣的哦【CSDN大禮包】最新網絡安全/網安技術資料包~282G無償分享1.從0到進階主流攻防技術視頻教程包含紅藍對抗、CTF、HW等技術點2.入門必看攻防技術書籍pdf書面上的技術書籍確實太多了這些是我精選出來的還有很多不在圖里3.安裝包/源碼主要攻防會涉及到的工具安裝包和項目源碼防止你看到這連基礎的工具都還沒有4.面試試題/經驗網絡安全崗位面試經驗總結誰學技術不是為了賺$呢找個好的崗位很重要需要的話可以V掃描下方二維碼聯系領取~因篇幅有限資料較為敏感僅展示部分資料添加上方即可獲取如果二維碼失效可以點擊下方鏈接去拿一樣的哦【CSDN大禮包】最新網絡安全/網安技術資料包~282G無償分享