欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Go語言實現(xiàn)線性查找算法和二分查找算法

 更新時間:2022年12月20日 08:15:05   作者:陳明勇  
線性查找又稱順序查找,它是查找算法中最簡單的一種。二分查找,也稱折半查找,相比于線性查找,它是一種效率較高的算法。本文將用Go語言實現(xiàn)這兩個查找算法,需要的可以了解一下

線性查找

線性查找又稱順序查找,它是查找算法中最簡單的一種。它的基本思想是在在一組數(shù)據(jù)中,從第一個元素開始,依次和預期值比較,直到和預期值相等,則查找成功,如果所有元素都比較過,沒找到與預期值相等的元素,則查找失敗。

算法

func LinearSearch(nums []int, target int) int {
    for i, num := range nums {
        if num == target {
            return i
        }
    }
    return -1
}

算法很簡單,遍歷 nums 切片,然后依次比較,找到與 target 相等的元素則返回該元素在切片中的下標值,否則返回 -1,表示沒有找到與 target 相等的元素。

該算法的時間復雜度為 O(N)??梢园l(fā)現(xiàn),如果切片里有很多元素,然后要查找到元素處于最后一個位置,或者根本就沒有要查找的元素,算法將遍歷一整個切片,這種查找效率很低。

二分查找

二分查找,也稱折半查找,相比于線性查找,它是一種效率較高的算法,但是二分查找要求數(shù)組或切片中的元素必須是有序存儲的。時間復雜度為 O(logn)。圖解:

nums = [1, 2, 3, 4, 5]

  • 劃定左邊界 left 和右邊界 right,初始值分別為 0 ,數(shù)組長度 - 1 = 5 - 1 = 4
  • 遍歷數(shù)組 nums,取區(qū)間的中間位置 mid = left + (right - left) / 2 = 2,使用這個公式而不是 [ (left + right) / 2] 是防止 left + right 之后的值溢出。
  • 比較數(shù)值,如果中間值 nums[mid] 與 目標值 target 相等,則結(jié)束查找
  • 如果中間值 nums[mid] 大于目標值 target,說明要尋找的值可能在左邊的區(qū)間,移動右邊界的位置,往坐區(qū)間尋找。
  • 如果中間值 nums[mid] 小于目標值 target,說明要尋找的值可能在右邊的區(qū)間,移動左邊界的位置,往坐區(qū)間尋找。
  • 重復以上查找的操作,直到找到元素,或遍歷結(jié)束。

算法

func BinarySearch(nums []int, target int) int {
    left, right := 0, len(nums)-1
    for left <= right {
        mid := left + (right-left)/2
        if nums[mid] == target {
            return mid
        } else if nums[mid] > target {
            right = mid - 1
        } else {
            left = mid + 1
        }
    }
    return -1
}

上述代碼是基于區(qū)間【左閉右閉】的特點去編寫的,左閉右閉就是區(qū)間涵蓋左邊界的元素和右邊界的元素。

【左閉右閉】這個特點會影響 for 循環(huán) 的條件 → left <= right,因為區(qū)間包含右元素,因此left 等于 right 是有意義的。

除此之外,左閉右閉的特點還會影響 leftright 的值,初始值為 0,和 len - 1。因為 mid 的值已經(jīng)比較過了,基于左閉右閉的特點,left 下次的值應(yīng)為 mid + 1,而 right 下次的值應(yīng)為 mid - 1,不能為 mid

總之,左閉右閉的特點,影響著循環(huán)條件,和 leftright 的值。

  • 初始值 left = 0, right = len - 1
  • 循環(huán)條件 left <= right
  • 后續(xù)值 left = mid + 1,right = mid -1

【左閉右開】的算法:

func BinarySearch(nums []int, target int) int {
    left, right := 0, len(nums)
    for left < right {
        mid := left + (right-left)/2
        if nums[mid] == target {
            return mid
        } else if nums[mid] > target {
            right = mid
        } else {
            left = mid + 1
        }
    }
    return -1
}

左開右閉,涵蓋左邊的元素,不包含右邊的元素,因此 left = 0,我們要取到數(shù)組的最后一個元素,right 的值取不到,因此 right = len,這樣就能取到 len - 1 的值了。

循環(huán)條件,left < right,沒有等于號,因為 right 取不到,等于的話是沒有意義的。

由于 mid 已經(jīng)比較過了,后續(xù) left 的值為 mid + 1right 的值為 mid。

總結(jié)

  • 初始值 left = 0, right = len
  • 循環(huán)條件 left < right
  • 后續(xù)值 left = mid + 1,right = mid

小結(jié)

本文對線性查找算法和二分查找算法進行了介紹。線性查找算法雖簡單,但是查找效率低,時間復雜度為 O(N);而二分查找法效率雖較高,但是所查找的數(shù)組必須是有序的,時間復雜度為 O(logn),基于區(qū)間特點的不同(左閉右閉、左閉右開),二分查找算法的寫法也不同。

到此這篇關(guān)于詳解Go語言實現(xiàn)線性查找算法和二分查找算法的文章就介紹到這了,更多相關(guān)Go查找算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言使用AES加密解密的示例代碼

    Go語言使用AES加密解密的示例代碼

    這篇文章主要介紹了Go語言使用AES加密解密的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • golang gin 框架 異步同步 goroutine 并發(fā)操作

    golang gin 框架 異步同步 goroutine 并發(fā)操作

    這篇文章主要介紹了golang gin 框架 異步同步 goroutine 并發(fā)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang基礎(chǔ)學習之map的示例詳解

    Golang基礎(chǔ)學習之map的示例詳解

    哈希表是常見的數(shù)據(jù)結(jié)構(gòu),有的語言會將哈希稱作字典或者映射,在Go中,哈希就是常見的數(shù)據(jù)類型map,本文就來聊聊Golang中map的相關(guān)知識吧
    2023-03-03
  • Golang使用Gin處理下載文件請求返回

    Golang使用Gin處理下載文件請求返回

    在Go語言中,使用Gin框架實現(xiàn)文件下載功能相對簡單,本文給大家展示一個簡單的示例,演示如何使用Gin來處理文件下載請求,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Golang中的select語句及其應(yīng)用實例

    Golang中的select語句及其應(yīng)用實例

    本文將介紹Golang中的select語句的使用方法和作用,并通過代碼示例展示其在并發(fā)編程中的實際應(yīng)用,此外,還提供了一些與select相關(guān)的面試題,幫助讀者更好地理解和應(yīng)用select語句
    2023-12-12
  • 詳解Go語言中Goroutine退出機制的原理及使用

    詳解Go語言中Goroutine退出機制的原理及使用

    goroutine是Go語言提供的語言級別的輕量級線程,在我們需要使用并發(fā)時,我們只需要通過?go?關(guān)鍵字來開啟?goroutine?即可。本文就來詳細講講Goroutine退出機制的原理及使用,感興趣的可以了解一下
    2022-07-07
  • Go工具鏈之go tool fix用法詳解

    Go工具鏈之go tool fix用法詳解

    go tool fix 是 Go 工具鏈中的一個命令,作用是把指定 Go 程序代碼包中的的所有舊版本代碼修正為新版本的代碼,本文將簡單介紹一下go tool fix的使用方法,感興趣的小伙伴可以參考閱讀下
    2023-07-07
  • golang簡單獲取上傳文件大小的實現(xiàn)代碼

    golang簡單獲取上傳文件大小的實現(xiàn)代碼

    這篇文章主要介紹了golang簡單獲取上傳文件大小的方法,涉及Go語言文件傳輸及文件屬性操作的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • Golang為什么占用那么多的虛擬內(nèi)存原理解析

    Golang為什么占用那么多的虛擬內(nèi)存原理解析

    這篇文章主要介紹了Golang為什么占用那么多的虛擬內(nèi)存原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 在Linux系統(tǒng)中安裝Go語言的詳細教程

    在Linux系統(tǒng)中安裝Go語言的詳細教程

    這篇文章主要介紹了在Linux系統(tǒng)中安裝Go語言的詳細教程,由于國內(nèi)很多人對谷歌的盲目追捧,導致Go語言在國內(nèi)的人氣遠超國外...需要的朋友可以參考下
    2015-06-06

最新評論