我已經多次使用這個算法在Ints
或Longs
上進行二分搜索。基本上,我從Long.MinValue
和Long.MaxValue
開始,並決定將位設置爲i
th位置,具體取決於函數I正在最大化(或最小化)的值。實際上,這樣會更快(正好是63 * 2位操作),並且更容易編碼,並避免了許多gotchas of traditional binary search implementations。通過掩碼進行二進制搜索?
這是我在斯卡拉算法:
/**
* @return Some(x) such that x is the largest number for which f(x) is true
* If no such x is found, return None
*/
def bitBinSearch(f: Long => Boolean): Option[Long] = {
var n = 1L << 63
var p = 0L
for (i <- 62 to 0 by -1) {
val t = 1L << i
if (f(n + t)) n += t
if (f(p + t)) p += t
}
if (f(p)) Some(p) else if (f(n)) Some(n) else None
}
我有3個問題:
什麼叫文學這個算法?當然,我不能成爲這個的發明者 - 但是,當我嘗試以二進制搜索+位掩碼/切換的各種組合搜索時,我沒有找到任何東西。我一直親自稱它爲「bitBinSearch」。我還沒有看到這篇文章提到的文章通過
Int
或Long
域的二進制搜索,這將是微不足道的寫作。無論如何可以改進/縮短代碼嗎?現在我跟蹤
n
和p
中的負面和正面解決方案。任何聰明的方法,我可以將它們合併成單個變量?下面是一些樣品測試案例:http://scalafiddle.net/console/70a3e3e59bc61c8eb7acfbba1073980c試圖回答是否有可以由具有
Double
S和Float
s到工作之前的版本?
最低值我倒覺得有點來回切換是一個實現細節和並不重要:該算法仍稱爲二分查找。 – Bergi
@Bergi:澄清 - 我知道該算法仍然是一般的二進制搜索;但是,這個具體的實現叫做什麼? – pathikrit
改進?你不需要每次都用t來移動,而是你可以換一個常數。初始化爲1 << 62,每次迭代右移一位。 – TheGreatContini