從C++入門第五版問題3.26中是個問題,我不知道它們之間的區別嗎? 可能是第二個可以避免溢出。在二分查找中mid =(beg + end)/ 2和mid = beg +(end-beg)/ 2之間有什麼區別?
回答
一般情況下,這兩個表達式都是無效的。例如,第一個表達式是無效的,因爲對於指針或迭代器,不存在+這樣的操作。 如果使用非隨機訪問迭代器,則第二個表達式無效。例如,當使用雙向迭代器時。
所以在C++正確的建設將看看下面的方式
mid = std::next(beg, std::distance(beg, end)/2);
你想在非隨機訪問迭代器上運行二進制搜索? –
這不僅是我。但是C++標準聲明std :: binary_search與轉發迭代器 template
我想如果比較函數非常昂貴,這是有意義的。通常它是沒有意義的,因爲你失去了運行時間的O(log n)界限。 –
如果我們考慮在一個比較通用的設置兩條線,不相關的二進制搜索,以下意見可以提出:
第二種形式試圖避免的問題是溢出,試圖表示一個大於最大可表示數字的數字,這是正確的。
對於單個數字的大小和結尾數量沒有限制,因此它們可能都大於最大可表示數字的一半。添加它們意味着中間結果(beg + end)可能溢出。
第二個解決方案似乎消除溢出的風險,但引入了一個又一個。如果值是有符號值,它們的區別可以再次溢出(或下溢,這取決於他們的標誌)。無符號值沒有問題。
還有另一種解決方案,你沒有張貼:
mid = beg/2 + end/2
它解決了溢和下溢的每一個問題,但引入了精度損失的一個新問題。如果與整數值工作,通過2分割可以通過0.5得到的結果斷,將這些一起,意味着中間可由1處於關閉狀態:
mid = 3/2 + 5/2; // mid is 3, instead of the 4 expected
與浮點值工作具有其他精度問題。
再回到手頭的問題,二進制搜索,可以很容易地看到,乞討和終點是無符號的值,所以第二個解決方案將總是給出正確的結果。
答案是在書:
「由於從迭代結束返回不表示元件,它可能不 增加或取消引用。「
圖形是有意義作爲不對稱範圍, [開始,現成的,端) 或半開區間。
從加速C++,28頁,科尼格。
- 1. $ a == 2和2 == $ a之間有什麼區別?
- 2. 'end'和'end as'有什麼區別
- 3. C#中myArray.GetValue(2)和myArray [2]之間的區別是什麼?
- 4. 3/2和-3/2有什麼區別?
- 5. (int *)arr [2]和int * arr [2]之間的區別是什麼?
- 6. Magento :: soap API版本1和2之間有什麼區別?
- 7. JavaFX-2:場景和窗格之間有什麼區別
- 8. d.update(dict(a = 1,b = 2))和d.update(dict('a'= 1,'b'= 2)之間有什麼區別)
- 9. mid()= foo在VBS中?
- 10. Object,Object和[1:Object,2:Object]之間有什麼區別?
- 11. 相機和相機2之間有什麼區別API
- 12. MID()與中期$()
- 13. VBA中的MID和CONCATENATE
- 14. Silverlight 2和Silverlight 3之間有什麼區別?
- 15. @Entity和@embeddable之間有什麼區別
- 16. Long.toBinaryString()和Long.toString(num,2)之間的區別?
- 17. Excel Mid Find查找,從右到左看
- 18. 2個SQL查詢有什麼區別?
- 19. .Value =「」和.ClearContents之間有什麼區別?
- 20. ionic-native和@ ionic-native/xxx之間的區別是什麼2
- 21. Excel中:與MID
- 22. 「#{self.key}」和「vynd6tg1hh」之間有什麼區別?
- 23. strcmp()和strcoll()之間有什麼區別?
- 24. Powershell:Sleeping mid-pipeline
- 25. Rails 1.X和2.X之間的主要區別是什麼
- 26. WebAPI和WebAPI 2有什麼區別
- 27. ||之間有什麼區別?和|在R?
- 28. kEND和$ end有什麼區別?
- 29. lisp中'((1 2)(3 4))和'('(1 2)'(3 4))之間的區別是什麼?
- 30. webpack 1和webpack 2有什麼區別?
它甚至發生最好:Jon Bentley在Programming Pearls中的二進制搜索包含了這個溢出漏洞。 – TemplateRex
在計算數組中間時爲什麼選擇start +(end-start)/ 2 over(start + end)/ 2? http://stackoverflow.com/questions/38688028/why-prefer-start-end-start-2-over-start-end-2-when-calculating-the) –