• <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 那誰 閱讀(3734) 評論(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
            久久久SS麻豆欧美国产日韩| 国产偷久久久精品专区| 久久综合狠狠色综合伊人| 69久久精品无码一区二区| 精品999久久久久久中文字幕| 一本一道久久精品综合| 国产综合精品久久亚洲| 亚洲精品国产自在久久| 久久久久免费看成人影片| 亚洲狠狠综合久久| 国产精品亚洲综合久久| 久久综合综合久久综合| 很黄很污的网站久久mimi色| 久久精品国产99国产精品亚洲| 久久天天躁狠狠躁夜夜avapp| 久久精品无码av| 久久久婷婷五月亚洲97号色| 久久精品中文字幕有码| 精品国产VA久久久久久久冰| 久久久久久毛片免费看| 久久精品aⅴ无码中文字字幕重口| 久久精品国产亚洲7777| 97久久久精品综合88久久| 伊人久久大香线蕉成人| 精品久久久久久无码国产| 久久久噜噜噜久久熟女AA片| 无码精品久久一区二区三区| 天天综合久久久网| 国产美女久久久| 久久精品国产亚洲精品2020| 久久婷婷五月综合成人D啪| 久久天天日天天操综合伊人av | 午夜天堂av天堂久久久| 国产999精品久久久久久| 国产精品免费福利久久| 97精品依人久久久大香线蕉97| 色综合久久久久综合99| 99久久精品国产综合一区 | 亚洲欧美成人久久综合中文网| 久久这里只精品国产99热| 国产一级持黄大片99久久|