1,題目
2,各種演算法
int maxsubseqsum1(int a, int n, int* pidxstart, int* pidxend)
if (tempsum > sum)
} }return sum;
}
粗略的看三重迴圈,演算法複雜度是o(n^3),空間上沒有大空間的開闢。
int maxsubseqsum2(int a, int n, int* idxstart, int* idxend)
} }return maxsum;
}
演算法複雜度o(n^2),和第乙個演算法相比到底是哪個地方優化了呢?原因在於很多子段和有重疊的地方,第乙個算的法重複計算重複計算特別多,第二個相對少多了,但還是有很多子段和是重疊計算的,這說明這個演算法還有很大的提高的空間。
int max(int a, int b, int c)
int maxsubseqsum3(int a, int beg, int end)
int mid = (beg + end) / 2;
int left, right, lsum = a[mid], thislsum = 0, rsum = a[mid+1], thisrsum = 0;
int i;
left = maxsubseqsum3(a, beg, mid);
right = maxsubseqsum3(a, mid+1, end);
for (i = mid; i >= 0; i--)
} for (i = mid+1; i <= end; i++)
} return max(left, lsum+rsum, right);
}
分治演算法因為使用到遞迴,所以一般實際中也不會用,因為在實際中資料偏大,遞迴過程中會開闢很多的空間,造成空間超出記憶體。其優美之處在於其演算法複雜度的數學分析上,其演算法複雜度是o(n * ln(n)),具體參看《演算法導論》。
很多數學概念學起來是枯燥無味的,因為它們是現實世界的抽象,完全扭曲了我們觀察事物的直觀感覺,另一方面,數學是真正的抓住了核心和本質,所以很多繁雜的現象,可能用乙個方程式子就完全描述了,譬如說愛因斯坦的質量方程,麥克斯韋的電磁方程組。
看上面的圖,我們用數學語言描述乙個過程:我們要尋找物質a,尋找的範圍是t,可是t的範圍太大了,可能花費多少力氣都完不成;由於物質a具有性質b,那麼b性質就是物質a的必要條件(也就是必須滿足的條件),在t中發現滿足b性質的是範圍c,那麼我們直接在c範圍中尋找物質a就行了,而且範圍c非常小,使得我們很快的找到了物質a。
最大子矩陣 C語言實現
演算法核心 先將二維陣列處理為一維陣列,再對一維陣列進行最大連續子串行求和,這裡最大連續子串行求和採用的是遞推的方法。演算法步驟 1 將原矩陣初始化,並建立乙個臨時二維矩陣,該矩陣的第i行表示的是原矩陣前i行的和 2 採用窮舉的方法,計算二維矩陣所有可能的連續行的列的和,使其壓縮為一維陣列 3 對步...
最大子列和問題(C語言實現)
最大子列和問題 pta 程式設計類實驗輔助教學平台 給定k 個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情...
最大子段和
設a 是n個整數的序列,稱為該序列的子串行,其中1 i j n.子串行的元素之和稱為a的子段和.例如,a 2,11,4,13,5,2 那麼它的子段和是 長度為1的子段和 2,11,4,13,5,2 長度為2的子段和 9,7,9,8,7 長度為3的子段和 5,20,4,6 長度為4的子段和 18,15...