Go語言實(shí)現(xiàn)二分查找方法示例
使用官方sort包提供search方法快速實(shí)現(xiàn)
對已經(jīng)排好序的數(shù)據(jù), 想快速地找出某一個在對應(yīng)slice的位置索引, 我們可以使用官方sort包提供的search方法快速地實(shí)現(xiàn)二分查找.
官方源碼實(shí)現(xiàn)也非常簡單
func Search(n int, f func(int) bool) int { // Define f(-1) == false and f(n) == true. // Invariant: f(i-1) == false, f(j) == true. i, j := 0, n for i < j { h := int(uint(i+j) >> 1) // avoid overflow when computing h // i ≤ h < j if !f(h) { i = h + 1 // preserves f(i-1) == false } else { j = h // preserves f(j) == true } } // i == j, f(i-1) == false, and f(j) (= f(i)) == true => answer is i. return i }
sort.Search的作用就是通過二分法, 找到滿足條件的, 即函數(shù)f返回true的數(shù)據(jù)的最小索引, 如果無法找到目標(biāo)值, 則返回參數(shù)n的結(jié)果.
在實(shí)際業(yè)務(wù)中, n一般都是使用查找切片數(shù)據(jù)的長度, 所以在Search方法返回之后, 需要判斷i是否還是目標(biāo)切片的合理索引.
查找第一個大于等于x的索引
func SearchTargetAfter(dataList []int, x int) int { return sort.Search(len(dataList), func(i int) bool { return dataList[i] >= x }) }
查找第一個小于等于x的索引
func SearchTargetBefore(dataList []int, x int) int { return sort.Search(len(dataList), func(i int) bool { return dataList[i] <= x }) }
查找一個確定的數(shù)
那么我就要查找一個確定的數(shù), 我們該怎么做呢?
舉個例子
arrInts := []int{1, 3, 4, 9, 12, 13} findPos := sort.Search(len(arrInts), func(i int) bool { return arrInts[i] == 4 })
結(jié)果輸出, 并不是2, 而是6. 仔細(xì)去看上面的源碼也不難發(fā)現(xiàn), 官方的二分查找的方法, 如果使用了數(shù)值相等來判斷, 就要讓數(shù)據(jù)正好落在每次的二分的位置這樣才能找到, 比如上述的代碼中, 原始的切片數(shù)據(jù)不變的情況下, 如果改為查找的目標(biāo)為9, 那么是可以正確獲取位置的.
因此這里要注意, 如果要查找確定的數(shù)字的目標(biāo)位置, 使用sort.Search方法的時候, func的返回值, 需要使用上述的找到第一個大于等于目標(biāo)索引的位置, 或者小于等于目標(biāo)索引的位置, 得出來索引位置之后, 再去獲取索引值是否跟目標(biāo)數(shù)據(jù)一樣, 來判斷該數(shù)據(jù)是否存在這個數(shù)組中以及它所處的位置.
以上就是Go語言實(shí)現(xiàn)二分查找方法示例的詳細(xì)內(nèi)容,更多關(guān)于Go 二分查找的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
提升Go語言開發(fā)效率的小技巧實(shí)例(GO語言語法糖)匯總
這篇文章主要介紹了提升Go語言開發(fā)效率的小技巧匯總,也就是Go語言的語法糖,掌握好這些可以提高我們的開發(fā)效率,需要的朋友可以參考下2022-11-11Go語言:打造優(yōu)雅數(shù)據(jù)庫單元測試的實(shí)戰(zhàn)指南
Go語言數(shù)據(jù)庫單元測試入門:聚焦高效、可靠的數(shù)據(jù)庫代碼驗(yàn)證!想要確保您的Go應(yīng)用數(shù)據(jù)層堅(jiān)如磐石嗎?本指南將手把手教您如何利用Go進(jìn)行數(shù)據(jù)庫單元測試,輕松揪出隱藏的bug,打造無懈可擊的數(shù)據(jù)處理邏輯,一起來探索吧!2024-01-01源碼分析Golang?log是如何實(shí)現(xiàn)的
go語言的log包提供了簡單的日志記錄功能,允許開發(fā)者在應(yīng)用程序中記錄重要的信息、錯誤、警告等,log包是Go標(biāo)準(zhǔn)庫的一部分,因此,使用它不需要安裝額外的第三方庫,本文給大家源碼分析了Golang?log是如何實(shí)現(xiàn)的,需要的朋友可以參考下2024-03-03golang 實(shí)現(xiàn)兩個結(jié)構(gòu)體復(fù)制字段
這篇文章主要介紹了golang 實(shí)現(xiàn)兩個結(jié)構(gòu)體復(fù)制字段,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04用Go語言標(biāo)準(zhǔn)庫實(shí)現(xiàn)Web服務(wù)之創(chuàng)建路由
在上一節(jié)中創(chuàng)建了項(xiàng)目,這篇文章主要介紹如何用Go語言標(biāo)準(zhǔn)庫創(chuàng)建路由,文中有詳細(xì)的代碼示例,對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以參考下2023-05-05