主要介紹七種基本的演算法基礎設計
1.列舉
2.遞推
3.遞迴
3.貪心演算法
5.分治演算法
6.雜湊
7.二分法
列舉演算法是指從可能的解集中一一枚舉出各個元素,用題目給定的約束條件判斷哪些是滿足題目條件的,哪些是不滿足條件的,滿足條件的即為可行解。
列舉演算法分為兩步:1)確定解的範圍,並逐一列舉其中的元素;2)對列舉每乙個可能的解進行檢驗。
程式設計中常用的遞迴呼叫函式即用了遞迴的演算法思想。
貪心演算法能夠對某些求最優解問題給出更簡單、更迅速的實現,對大多數優化問題能夠產生最優解,是一種應用廣泛的演算法。
在程式設計中,常常需要使用資料結構來維護乙個動態集合,並且支援在該動態集合中進行查詢、插入和刪除元素等操作。
將所有衝突的元素放入乙個鍊錶,整個雜湊表的結構類似乙個鄰接表結構。表中的每個位置存放的不是指向元素位址的指標或者元素本身,而是對應雜湊值所在鍊錶的頭指標。
4.開放定址法
必須滿足m>=|s|。開放定址法將對雜湊函式進行擴充,使得探查函式作為第二個引數傳入函式,即h(k,i)。h(k,i)對於某個關鍵字k可以生成乙個探查序列,並且滿足探查序列為(0,1,······,m-1)的乙個序列。有三種計算探查序列的方法;線性探查、二次探查和雙重探查。
二分查詢:
當集合是靜態的,且有序儲存在陣列中時,可以使用二分查詢來優化查詢操作,使得每次查詢的最壞時間複雜度為o(log2 n)。
假設所有元素有序遞增儲存在陣列a[1·····n],待查數key,二分查詢思路如下:
偽**:
1)查詢區間為[low, high],如果low>high,可以確定key不存在與陣列中,否則確定當前區間重點為mid=(low+high)/2;
2)將a[mid]與key比較,兩值相等則返回當前中點位置;若a[mid]>key,則key位於陣列a的左邊,更新查詢區間為[low,mid-1];反之更新查詢區間為[mid+1,high]。
二分逼近:
對於乙個給定數key,求取序列中key的前驅或後繼,即詢問集合中所有不小於key的數中最小的那個數,或者集合中所欲不大於key的最大的那個數。
常見題型:
1.求乙個字串**現至少k次的最長重複子串的長度。
分析:用二分和雜湊表。如果在字串中存在長度為l且出現至少k次的子串,則必然也存在長度為l-1且出現至少k次的子串。可以通過二分長度後驗證滿足條件的最大長度。當二分長度為l後,只需遍歷字串中所有長度為l的子串。可以使用字串雜湊的方法將所有長度為l的子串用整數代替,存入雜湊表內維護。如果在雜湊表中有乙個字串出現次數超過k,則代表存在長度為l的子串出現了至少k次。
幾個基本的演算法設計方法
1 遞迴和遞推。遞迴和遞推是學習演算法設計的第一步。遞迴演算法是把大問題分解成相對較小的問題的過程,而遞推就是從小問題逐步推導出大問題的過程。無論遞迴還是遞推,都應該有初始狀態。2 搜尋 列舉及優化剪枝。搜尋在所有演算法中既是最簡單也是最複雜的演算法。說它簡單,是因為演算法本身並不複雜,實現容易 說...
NOIP 基本演算法設計 高精度演算法與快速冪
有的時候,數字會大到連long long 或int64 都不能承受的程度。這時,我們可以用陣列來模擬大數的各種運算。該模擬方法即為高精度演算法。快速冪即為求解形如an的快速演算法。高精度的儲存 高精度儲存採用陣列儲存每一位的值,並記錄陣列的長度和正負性。一般來講,陣列的下標越小,對應的整數的位越小。...
並行演算法設計基本原則
並行演算法是平行計算的基礎,與實現技術相結合,為高效率使用並行計算機提供解決方案。其基本原則簡述如下 常見的平行計算的硬體載體有fpga gpu 多核cpu arm x86 dsp等。fpga硬體加速的思想是設計流水線和設計多個加速核。gpu和多核cpu通過多核運算來達到並行的目的,核與核之間的通訊...