1、問題描述:給定
n個數,求相鄰的
k個數之和為最大。要求給出複雜度較小的一種演算法
再解決這個問題前,先了解一下類似的常見問題。
2、給定一串數字(可正可負的
int,放在陣列
num裡),要求找到起始位置
start
和終止位置
end,使得從
start
位置到end
位置的所有數字之和最大,返回這個最大值
max。
演算法思想:用動態規劃演算法實現。
設 imaxsum
為以 inumpar
[i]終止且包含
inumpar
[i]的最大序列的和,有:
imaxsum =
inumpar
[0];
imaxsum = imaxsum > 0 ? imaxsum +
inumpar
[i+1] :
inumpar
[i+1];
其中,i = 0,1,...
那麼和imaxsum
就是 inumpar
[0] ...
inumpar
[n] 中最大的乙個序列。
演算法的時間複雜度為o(n)
。示例**
#include using namespace std;
void findthemaxsum(int inumpar, const int isize, int &ibegin, int &iend, int &imaxsum)
else
if (itemsum > imaxsum) //更新結果
}}int main()
; icount = sizeof(inum)/sizeof(inum[0]);
findthemaxsum(inum, icount, ibegin, iend, iresult);
cout << ibegin <<" "<< iend <<" "<< iresult <
3、最容易想到的就是窮舉搜尋。在
n個序列中求出每
k個連續序列的值,進行比較。
示例**
#include using namespace std;
void findthemaxksum(int inumpar, const int isize, int ik, int &ibegin, int &iend, int &imaxsum)
imaxsum = itemmaxksum;
int istart = ibegin = 0, iover = iend = ik - 1;
for (int i = 1; (i < isize) && ((isize - i) >= ik); ++i)
if (itemmaxksum > imaxsum)
}}int main()
; icount = sizeof(inum)/sizeof(inum[0]);
findthemaxksum(inum, icount, 3, ibegin, iend, iresult);
cout << ibegin <<" "<< iend <<" "<< iresult <
由上可見,複雜度為o(ik + n*k)
。那麼有沒有更好的方法呢?優化的方法就是把迴圈體內的相加迴圈去掉。
示例**
#include using namespace std;
void findthemaxksum(int inumpar, const int isize, int ik, int &ibegin, int &iend, int &imaxsum)
int istart = ibegin = 0;
ibegin = 0;
iend = ik - 1;
imaxsum = ptempsum[iend];
for (int i = 1, j = ik; j < isize; ++i, ++j) }
delete ptempsum;
}int main()
; icount = sizeof(inum)/sizeof(inum[0]);
findthemaxksum(inum, icount, 3, ibegin, iend, iresult);
cout << ibegin <<" "<< iend <<" "<< iresult <
由上可見,程式複雜度為o(n),n
為問題規模。
參考[1]更多的數學說明:
[2]csdn論壇中的討論
給定N個數,確定第K個最大值
選擇問題 給定n個組,確定第k個最大值 稍微好一點的演算法可以先把前k個元素讀人陣列並 以遞減的順序 對其排序。接著,將剩下的元素再逐個讀人。當新元素被讀到時,如果它小於陣列中的第個元素則忽略,否則就將其放到陣列中正確的位置上,同時將陣列中的乙個元素擠出陣列。當演算法終止時,位於第k個位置上的元素作...
求n 中因子k的個數
思路 求n的階乘某個因子k的個數,如果n比較小,可以直接算出來,但是如果n很大,此時n 超出了資料的表示範圍,這種直接求的方法肯定行不通。其實n 可以表示成統一的方式。n km m a 其中k是該因子,m n k,a是不含因子k的數的乘積 下面推導這個公式 n n n 1 n 2 3 2 1 k 2...
N個數中的前k個
題目描述 n個數,列印出重複次數最多的前十個 方法 無序容器 優先順序佇列 資料結構 雜湊單重對映表 優先順序佇列 步驟 1 遍歷所有的數,放進雜湊表中 2 找到前十個重複率最高的 3 列印 include include include include include includeusing n...