演算法筆記04--分治法之尋找最大最小元素
顧名思義,“分治”名字本身就已經給出了一種強有力的演算法設計技術,它可以用來解決各類問題。在它最簡單的形式裡,一個分治演算法把問題例項劃分成若干子例項(多數情況是分成兩個),並分別遞迴地解決每個子例項,然後把這些子例項的解組合起來,得到原問題例項的解。
尋找最大最小解
一種直接的演算法如下所示,它返回一個數對(x,y),其中x是最小值,y是最大值
1 x<-A[1] ; y<-A[1]
2 for i <- 2 to n
3 if A[i] < x then x <- A[i]
4 if A[i] > y then y <- A[i]
5 end for
6 return (x,y)
很顯然執行次數為2*n-2
下面使用分治策略。
思路:
將陣列分割成兩半子例項,遞迴的在每一個子例項中找到最大值和最小值,然後將兩個子例項的最小值中的最小值和最大值中的最大值返回。
時間複雜度:
C(n) = 1, n=2
C(n) = 2*C(n/2) + 2 , n>2
假設n = 2^k , k = log n
C(n) = 2*C(n/2) +2
= 2*(2*C(n/4) +2 ) + 2
.....
= 2^(k-1)*C(n/2^(k-1)) + 2^(k-1) + 2^(k-2) + + 2^2 + 2
= 2^(k-1)*(C(2)) + 2^k - 2
= 3n/2 - 2
程式碼:
#include<iostream>
using namespace std;
int A[8] = {5,-3,2,7,10,1,2,-8};
struct minmaxV
{
int maxV;
int minV;
};
minmaxV minmax(int low , int high)
{
minmaxV temp,temp1,temp2,temp3;
if(high - low==1)
{
if(A[low]<A[high])
{
temp.minV = A[low];
temp.maxV = A[high];
}
else
{
temp.minV = A[high];
temp.maxV = A[low];
}
return temp;
}
else
{
int mid = (low + high) /2 ;
temp1 = minmax(low,mid);
temp2 = minmax(mid+1 , high);
temp3.minV = (temp1.minV<temp2.minV)?temp1.minV:temp2.minV;
temp3.maxV = (temp1.maxV>temp2.maxV)?temp1.maxV:temp2.maxV;
return temp3;
}
}
int main()
{
minmaxV showMinMax;
showMinMax = minmax(0,7);
cout<<"min: "<<showMinMax.minV<<" max: "<<showMinMax.maxV<<endl;
return 1;
}
相關文章
- 演算法學習筆記-暴力搜尋和分治法演算法筆記
- 數字之魅:尋找陣列中的最大值和最小值陣列
- ACM 尋找最大數ACM
- 尋找陣列中的最大值和最小值O(1.5*N)陣列
- 尋找最大公因數(歐幾里得演算法)--C語言描述演算法C語言
- 網路流最大流、最小割學習筆記筆記
- Python演算法:分治法Python演算法
- 【Java】尋找陣列中“主要元素”Java陣列
- 漫畫演算法筆記 最小棧演算法筆記
- 分治法演算法學習(一)——歸併排序、求最大子陣列和演算法排序陣列
- 【位操作筆記】位計數演算法 分治法統計 4 另外一個版本筆記演算法
- CDQ分治學習筆記筆記
- CDQ 分治學習筆記筆記
- 點分治學習筆記筆記
- 演算法:利用分治演算法求解N個元素中的第M大元素演算法
- 尋找陣列中第K大的元素陣列
- 分治法
- HTML標記語法之表格元素HTML
- 【演算法拾遺】最大數和最小數演算法
- 演算法筆記03--歸納法之生成排列演算法筆記
- Python之 常用查詢演算法:最小項搜尋、順序搜尋、二分搜尋Python演算法
- 演算法找陣列中的特定元素演算法陣列
- 演算法學習記錄七(C++)--->二分法找有序旋轉陣列最小值演算法C++陣列
- 【.Net】從字串陣列中尋找數字的元素字串陣列
- 演算法筆記01--歸納法之整數冪演算法筆記
- 分治演算法演算法
- 百度筆試題:找最小的不重複數筆試
- 演算法筆記(廣度優先搜尋)演算法筆記
- HTML標記語法之圖片Img元素HTML
- 計算機演算法設計與分析筆記(二)——遞迴與分治計算機演算法筆記遞迴
- 153. 尋找旋轉排序陣列中的最小值排序陣列
- iOS生成最大最小數之間隨機數iOS隨機
- 【譯】Swift演算法俱樂部-查詢最大/最小值Swift演算法
- 最大公約數與最小公倍數演算法演算法
- 順序表應用7:最大子段和之分治遞迴法遞迴
- LintCode 尋找旋轉排序陣列中的最小值 II排序陣列
- 153. 尋找旋轉排序陣列中的最小值(中)排序陣列
- 程式設計求一維陣列中最大和最小的元素值程式設計陣列