使用 Go 語言對自定義結構體切片進行二分查詢的程式


在這篇 Go 語言文章中,我們將使用迭代和遞迴方法對自定義結構體切片進行二分查詢。二分查詢是一種搜尋演算法,用於在已排序的元素序列中查詢特定值的所在位置。

演算法

  • 步驟 1 − 首先,我們需要匯入 fmt 包。

  • 步驟 2 − 建立一個自定義的 Person 結構體,其中包含字串型別的 name 和整型型別的 age。

  • 步驟 3 − 現在,建立一個 bSearch() 函式,用於對 Person 結構體切片進行二分查詢。

  • 步驟 4 − 它將 low 和 high 變數分別初始化為切片的開頭和結尾,然後迴圈持續執行,直到 low 小於或等於 high。

  • 步驟 5 − 在每次迴圈迭代中,它計算 low 和 high 之間的中間點,並將該索引處的 Person 的 name 欄位與 key 進行比較。

  • 步驟 6 − 如果 name 欄位等於 key,則函式返回索引。如果 name 欄位小於 key,則將 low 更新為 mid + 1。否則,將 high 更新為 mid - 1。

  • 步驟 7 − 啟動 main() 函式。在 main() 函式內部,建立一個 Person 結構體切片和一個要搜尋的 key。

  • 步驟 8 − 現在,呼叫 bSearch() 函式並將結構體和 key 作為引數傳遞給它。

  • 步驟 9 − 將結果訊息列印到控制檯。如果函式返回 -1,則返回 false,否則返回 true。

示例 1

在本例中,我們將定義一個 bSearch() 函式,用於使用迭代方法對自定義結構體切片進行二分查詢。

package main

import "fmt"

type Person struct {
   name string
   age  int
}

func bSearch(people []Person, key string) int {
   l := 0
   h := len(people) - 1

   for l <= h {
      mid := (l + h) / 2

      if people[mid].name == key {
         return mid
      } else if people[mid].name < key {
         l = mid + 1
      } else {
         h = mid - 1
      }
   }
   return -1
}

func main() {
   people := []Person{
      {"Amy", 15},
      {"Bix", 20},
      {"Jim", 25},
      {"Ross", 40},
      {"Siri", 45},
   }

   key := "Siri"

   i := bSearch(people, key)

   if i == -1 {
      fmt.Printf("%s not found\n", key)
   } else {
      fmt.Printf("%s found at index %d\n", key, i)
   }
}

輸出

Siri found at index 4

示例 2

在本例中,我們將定義一個 bSearch() 函式,用於使用遞迴方法對自定義結構體切片進行二分查詢。

package main

import "fmt"

type Person struct {
   Name string
   Age  int
}

func bSearch(people []Person, target Person, low int, high int) int {
   if low > high {
      return -1
   }

   mid := (low + high) / 2
   if people[mid] == target {
      return mid
   } else if people[mid].Age < target.Age {
      return bSearch(people, target, mid+1, high)
   } else {
      return bSearch(people, target, low, mid-1)
   }
}

func main() {
   people := []Person{
      {"Angel", 10},
      {"Carie", 12},
      {"Simona", 15},
      {"John", 17},
      {"Sam", 20},
   }

   target := Person{"John", 17}
   index := bSearch(people, target, 0, len(people)-1)

   if index != -1 {
      fmt.Printf("%s found at index %d\n", target.Name, index)
   } else {
      fmt.Printf("%s not found\n", target.Name)
   }
}

輸出

John found at index 3

結論

我們已經成功編譯並執行了一個 Go 語言程式,該程式使用迭代和遞迴方法對自定義結構體切片進行二分查詢,並附帶兩個示例。在第一個示例中,我們使用了迭代方法,在第二個示例中,我們使用了遞迴方法。

更新於: 2023年4月3日

789 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.