1. 程式人生 > >(演算法導論習題解exercise2.3-7)給定一個整數序列以及一個數X,確定該序列中是否有兩個數的和為X

(演算法導論習題解exercise2.3-7)給定一個整數序列以及一個數X,確定該序列中是否有兩個數的和為X

這是<<演算法導論>>中的一題,exercise 2.3-7.

可以這麼做:
1) 首先將序列排序,去掉重複的元素.
2) 其次生成一個序列, 該序列中每個元素都是X-原序列中的值, 同樣的,去重.
3) 對這兩個已經排序好的序列進行合併操作.
4) 如果有兩個元素之和為X, 那麼在合併的時候必然是相鄰的元素.

比如序列 1, 3, 5, 8, X=8, 生成的新序列排序之後就是0, 3, 5, 7.在合併操作時出現兩個相鄰的3,因此該序列中存在3和5之和為8.

我想的另一種做法:
遍歷序列, 每次遍歷時將X-序列元素的差放入到另一個新的序列中的合適位置去, 使這個新的序列一直都是有序的.同樣的, 每次遍歷的時候都在這個新的序列中搜索是否存在當前元素, 由於是有序的, 所以可以採用二分查詢的方法.
比如對於序列5,1,8,3, X=8.
首先遍歷的元素是5, 此時新的序列是空的,將8-5=3放入到新的序列中.
其次遍歷的元素是1, 此時新的序列只有元素3, 將8-1=7放入到新的序列中, 形成3,7的有序序列.
再次遍歷的元素是8, 此時新的序列為3,7, 將8-8=0放入到新的序列中, 形成0,3,7的有序序列.
最後遍歷的元素是3, 此時新的序列是0,3,7, 查詢3成功, 退出.

不過, 很顯然, 第二種方法並不能達到題目要求的nlg(n)的要求.但是, 它的優點在於, 不一定非得遍歷完序列的所有元素就可以找到答案.

另外,這個題目給我的另一個啟示就是,在很多問題中, 排序和搜尋演算法絕對是最基礎的組成部分,你可能不會直接使用到它們, 但是會間接的使用或者借鑑到其中的想法幫助你解決問題.所以, 不管是效率比較低的插入演算法也好, 還是快速排序也好, 都要進行研究, 並且掌握其中蘊藏的思想.