• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            (算法導論習題解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)的要求.但是, 它的優點在于, 不一定非得遍歷完序列的所有元素就可以找到答案.

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


            posted on 2008-09-29 10:40 那誰 閱讀(3717) 評論(7)  編輯 收藏 引用 所屬分類: 算法與數據結構

            評論

            # re: (算法導論習題解ex2.3-7)給定一個整數序列以及一個數X,確定該序列中是否有兩個數的和為X  回復  更多評論   

            排序,然后枚舉+原序列二分(X-a[i])不行嗎?
            2008-09-29 11:53 | Ernls

            # re: (算法導論習題解exercise2.3-7)給定一個整數序列以及一個數X,確定該序列中是否有兩個數的和為X[未登錄]  回復  更多評論   

            首先nlogn的快排
            其次設一個首指針head 設一個尾指針tail
            while(head!=tail)
            {
            if(*head+*tail < num) head++;
            elseif(*head+*tail>num) tail--;
            else break;

            }

            if (head == tail)std::cout<<"Not found!";
            else
            std::cout<<*head<<" "<<*tail<<std::endl;

            復雜度是o(nlogn+n)=o(nlogn)
            2008-09-30 17:01 | Uo

            # re: (算法導論習題解exercise2.3-7)給定一個整數序列以及一個數X,確定該序列中是否有兩個數的和為X[未登錄]  回復  更多評論   

            @Uo
            嗯,樓上這個方法也不錯.
            2008-09-30 20:09 |

            # re: (算法導論習題解exercise2.3-7)給定一個整數序列以及一個數X,確定該序列中是否有兩個數的和為X[未登錄]  回復  更多評論   

            算法導論給出的算法復雜度精確計算應為nlgn+2*n 額外輔助空間為o(n)
            上面那個算法空間復雜度o(1),算法復雜度精確為nlgn+n
            2008-10-01 01:27 | Uo

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

            @Uo
            沒有回潄,很不嚴密
            2008-11-11 10:25 | Romeo

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

            1.先排序,
            2.然后 按照 n / 2 對序列進行二分查找

            3.然后根據查找的結果將 原序列分成A和B兩個部分

            4.然后對A中的每個元素a進行X-a在B中進行二分查找

            5. 如果找到則結束

            6.如果沒有找到則根據在B中查找的結果將B二分為B1和B2

            7然后對A中的下一個元素a1進行X-a1在B2中二分查找查找

            8回到5

            2009-10-02 04:26 | lzonline01

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

            如果原數組中有重復的兩個數,正好他們相加等于X呢?這樣博主的第一步”1) 首先將序列排序,去掉重復的元素.“就有問題了。

            比如1,3,4,4,5,8 X = 8
            2011-02-23 13:17 | wtommy
            999久久久国产精品| 国产人久久人人人人爽| 久久亚洲av无码精品浪潮| 午夜精品久久久久久| 久久久久人妻精品一区| 国产成人久久精品麻豆一区| 欧美亚洲日本久久精品| 亚洲国产精品无码久久一线 | 狠狠色丁香婷婷综合久久来来去| 久久精品国产一区二区三区| 日产精品久久久久久久| 国产精品gz久久久| 久久亚洲AV成人无码电影| 老司机午夜网站国内精品久久久久久久久 | 久久综合九色综合97_久久久| 久久精品国产精品亚洲下载 | 国产精品久久久久影视不卡| 亚洲精品tv久久久久久久久久| 久久99国内精品自在现线| 亚洲国产精品无码久久青草| 久久99精品国产| 婷婷久久香蕉五月综合加勒比| 久久青青国产| 精品久久久久一区二区三区| 国产69精品久久久久777| 久久天天躁夜夜躁狠狠| 久久经典免费视频| 欧美日韩中文字幕久久久不卡| 国产AⅤ精品一区二区三区久久| 亚洲AV无码1区2区久久| 无码人妻久久久一区二区三区| 久久强奷乱码老熟女| 久久人人爽人人爽AV片| 国产午夜精品理论片久久| 国产精品综合久久第一页| 99久久精品免费看国产| 伊人久久大香线蕉成人| 久久国产精品久久国产精品| 91精品国产综合久久精品| 日产精品久久久久久久| 久久综合给合久久国产免费|