在《資料結構和演算法分析——c語言描述》一書中,有一段關於求最大子列和的演算法比較,其中提到了用聯機演算法實現。
聯機演算法是在任意時刻演算法對要操作的資料唯讀入(掃瞄)一次,一旦被讀入並處理,它就不需要在被記憶了。
而在此處理過程中演算法能對它已經讀入的資料立即給出相應子串行問題的正確答案。
還有對這種演算法的無比崇拜
「該演算法僅需要常量空間並以線性時間執行,因此聯機演算法幾乎是完美的演算法。」
當然還是有缺點的
「不宜設計,正確性不易觀察,同時附加保留資訊較少」
我們今天把這些擺出來,並不深究這些。我們今天來談一下聯機演算法解決最大子串行的正確性
先擺出**,c語言版本的
int maxsubsequencesum(const int a,int n)
return maxsum;
}
理解的關鍵就在於:
如果a[i]為負值且為起點,則我們可以取a[i+1]為起點,此時離目標更進。如果以乙個 和為負數 的子列的起點,則我們可以捨去這個子列,此時也更進了目標一步。
但是不知道是書上沒寫清還是我沒注意到,有一種情況是客觀存在的,那就是所有的元素均為負值,此時根據這個聯機演算法我們得到的是0,但實際上結果應該是最大的元素。
那我們不妨加上一段**,如果maxsum為0,找出整個序列中的最大值即可
其實上了大學才發現,沒有什麼東西是好學的,無論是數學還是計算機,有點難受。
無論怎麼樣還是得硬著頭皮學下去啊,以後真的會感謝曾經努力的自己,真的。
經典演算法 求最大子列和
題目 最大連續子數列和一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列 不允許空序列 使它們的和盡可能大。我們一起用多種方式,逐步優化解決這個問題。為了更清晰的理解問題,首先我們先看一組資料 8 2 6 1 5 4 7 2 3 輸出 14 題解 ...
求最大子列和
給定乙個含有n整數的序列,求其最大子列和 即該序列中一段連續子串行和的最大值 大致思路是 定義乙個當前位置之前的序列和的最大值 maxsum 以及當前子串行的和 thissum 每迭代一次比較二者的大小關係,如果maxsum小於thissum,則更新maxsum,否則繼續遍歷。當thissum 0時...
求最大子列和問題
給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。在此方法中用了三個迴圈,第一層是子列左端,第二層是子列右端,裡層為子列的求和。t n o n 3 int thissum maxsum 0 i...