分治算法介绍
文章目錄
- 1 分治算法
- 1.1引入
- 1.2 分治算法介紹
- 1.3 應用實例
1 分治算法
1.1引入
一個裝有 16 枚硬幣的袋子,16 枚硬幣中有一個是偽造的,偽造的硬幣和普通硬幣從表面上看不出有任何差別,但是那個偽造的硬幣比真的硬幣要輕。現有給你一臺天平,請你在盡可能最短的時間內找出那枚偽造的硬幣。
常規思維:
每次從待比較的硬幣中取兩枚進行計較,如果天平平衡(相等)就繼續取剩下的硬幣進行比較。
繼續以上過程,直到找到硬幣。
強者思維:
我們先將 16 枚硬幣分為左右兩個部分,各為 8 個硬幣,分別稱重,必然會有一半輕一半重,而我們要的就是輕的那組,重的舍去。接下來我們繼續對輕的進行五五分,直至每組剩下一枚或者兩枚硬幣,這時我們的問題自然就解決了,下面用一張圖進行更好的理解。
1.2 分治算法介紹
分治法:
見名思義,即分而治之,從而得到我們想要的最終結果。分治法的思想是將一個規模為 N 的問題分解為 k 個較小的子問題,這些子問題遵循的處理方式就是互相獨立且與原問題相同。
兩部分組成:
分(divide):遞歸解決較小的問題
治(conquer):然后從子問題的解構建原問題的解。
三個步驟:
1、分解(Divide):將原問題分解為若干個規模較小,相互獨立,與原問題形式相同的子問題;
2、解決(Conquer):若子問題規模較小而容易被解決則直接解決,否則遞歸地解各個子問題;
3、合并(Combine):將各個子問題的解合并為原問題的解。
1.3 應用實例
二分查找算法實現:
#include <stdio.h> #include <stdlib.h>/*遞歸實現二分查找 參數:arr - 有序數組地址 arrminSub - 查找范圍的最小下標 minSubmaxSub - 查找范圍的最大下標 maxSubnum - 帶查找數字返回:找到則返回所在數組下標,找不到則返回-1 */int BinarySearch(int* arr,int minSub,int maxSub,int num){if(minSub>maxSub){return -1;//找不到 num 時,直接返回}int mid=(minSub+maxSub)/2;if(num<arr[mid]){return BinarySearch(arr,minSub,mid-1, num);}else if(num>arr[mid]){return BinarySearch(arr,mid+1,maxSub, num);}else{return mid;//找到 num 時直接返回} }int main(void){int arr[]={1, 3, 7, 9, 11};int index = BinarySearch(arr, 0, 4, 8);printf("index: %d\n", index);system("pause");return 0; }參考資料:
總結
- 上一篇: 买基金是选定投还是一次性买入 根据这几
- 下一篇: 动态规划算法介绍