最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言實(shí)現(xiàn)二分查找方法示例

 更新時間:2023年12月22日 11:28:47   作者:低配全棧  
這篇文章主要為大家介紹了Go語言實(shí)現(xiàn)二分查找方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jì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 語言中的 Context

    深入理解 Go 語言中的 Context

    這篇文章主要介紹了 理解 Go 語言中的 Context,需要的朋友可以參考下
    2020-06-06
  • VScode下配置Go語言開發(fā)環(huán)境(2023最新)

    VScode下配置Go語言開發(fā)環(huán)境(2023最新)

    在VSCode中配置Golang開發(fā)環(huán)境是非常簡單的,本文主要記錄了Go的安裝,以及給vscode配置Go的環(huán)境,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹

    Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹

    這篇文章主要介紹了Go 實(shí)現(xiàn)熱重啟的詳細(xì)介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • GoLang中的sync包Once使用執(zhí)行示例

    GoLang中的sync包Once使用執(zhí)行示例

    這篇文章主要介紹了GoLang中的sync包Once使用執(zhí)行示例,沒有學(xué)習(xí)Once前,大家可能想到 聲明一個標(biāo)識,表示是否初始化過,然后初始化這個標(biāo)識加鎖,更新這個標(biāo)識,Once包主要用于在并發(fā)執(zhí)行代碼的時候,某部分代碼只會被執(zhí)行一次
    2023-03-03
  • Go?語言進(jìn)階單元測試示例詳解

    Go?語言進(jìn)階單元測試示例詳解

    這篇文章主要為大家介紹了Go?語言進(jìn)階單元測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Golang中Append()使用實(shí)例詳解

    Golang中Append()使用實(shí)例詳解

    今天在刷leetcode的時候,第113題讓我遇到了一個Go語言中append函數(shù)的一個坑,所以復(fù)習(xí)下,這篇文章主要給大家介紹了關(guān)于Golang中Append()使用的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • golang中使用sync.Map的方法

    golang中使用sync.Map的方法

    這篇文章主要介紹了golang中使用sync.Map的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • go string to int 字符串與整數(shù)型的互換方式

    go string to int 字符串與整數(shù)型的互換方式

    這篇文章主要介紹了go string to int 字符串與整數(shù)型的互換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Go語言中的IO操作及Flag包的用法

    Go語言中的IO操作及Flag包的用法

    這篇文章介紹了Go語言中的IO操作及Flag包的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go語言sync鎖與對象池的實(shí)現(xiàn)

    Go語言sync鎖與對象池的實(shí)現(xiàn)

    本文介紹了Go語言標(biāo)準(zhǔn)庫sync包提供的并發(fā)控制工具,主要包括互斥鎖(sync.Mutex)和讀寫鎖(sync.RWMutex)兩類同步機(jī)制,下面就來具體介紹一下這兩個的使用,感興趣的可以了解一下
    2025-08-08

最新評論

伊金霍洛旗| 调兵山市| 平阴县| 临清市| 宣汉县| 乌鲁木齐市| 梅河口市| 正镶白旗| 汤阴县| 新建县| 南雄市| 德钦县| 贡觉县| 望谟县| 潮安县| 盱眙县| 阳泉市| 城步| 黄陵县| 万源市| 肇州县| 石家庄市| 昭通市| 嘉善县| 砚山县| 定襄县| 洛阳市| 屏东市| 尉氏县| 达孜县| 虎林市| 延津县| 罗甸县| 裕民县| 民权县| 景泰县| 华宁县| 新营市| 马公市| 武川县| 友谊县|