使用golang编写程序,在排好序的切片中找到目标元素的最后一个出现位置
在本文中,我们将学习如何使用线性搜索和二分搜索方法编写golang程序,以查找已排序切片中目标元素的最后一个出现位置。本文中将使用两个程序。在第一个程序中,我们将使用线性搜索方法,而在第二个程序中,我们将使用二分搜索方法实现结果。
使用线性搜索方法
在已排序的切片中查找目标元素的最后一个出现位置的最简单方法是执行线性搜索。在此方法中,我们从末尾开始迭代切片,直到找到目标元素为止。
算法
- 步骤1 - 首先,我们需要导入fmt包。
-
步骤2 - 然后创建一个名为lastIndexOfLinear()的函数,该函数接受两个参数,一个是整数数组,另一个是要在数组中搜索的数字。
-
步骤3 - 在函数内部使用for循环从末尾迭代切片。
-
步骤4 - 如果当前元素等于目标元素,则将“lastIndex”设置为当前索引。
-
步骤5 - 继续迭代,直到达到切片的起始位置,并返回lastIndex。
-
步骤6 - 现在,开始main()函数。在main()内部初始化一个整数数组并给其添加值。
-
步骤7 - 进一步存储要搜索的元素,并将其与数组一起传递到上述创建的函数中。
-
步骤8 - 将结果存储在变量中并在屏幕上打印出来。
实例
下面的示例演示如何开发使用线性搜索方法查找已排序的切片中目标元素的最后一个出现位置的Go语言程序。
package main
import (
"fmt"
)
func lastIndexOfLinear(nums []int, target int) int {
for i := len(nums) - 1; i >= 0; i-- {
if nums[i] == target {
return i
}
}
return -1
}
func main() {
nums := []int{10, 20, 30, 40, 50}
fmt.Println("给定的数组为:", nums)
var target int = 40
fmt.Println("要搜索的元素为:", target)
res := lastIndexOfLinear(nums, target)
fmt.Println("给定的元素", target, "位于位置:", res)
}
输出
给定的数组为: [10 20 30 40 50]
要搜索的元素为: 40
给定的元素40位于位置: 3
使用二分搜索法
二分搜索是在已排序切片中查找目标元素的最后一个出现位置的更有效的方法。在此方法中,我们将切片分成两半,并在可能包含目标元素的一半中继续搜索。
算法
- 步骤1 − 首先,我们需要导入fmt包。
-
步骤2 − 然后创建一个名为lastIndexOfLinear()的函数,该函数接受两个参数,一个是整数数组,另一个是要在数组中搜索的数字。
-
步骤3 − 在函数内部将“start”设置为0,“end”设置为切片的长度-1
-
步骤4 − 当“start”小于或等于“end”时,将“mid”设置为“start”和“end”的平均值
-
步骤5 − 如果索引“mid”处的元素等于目标元素,则将“lastIndex”设置为“mid”,将“start”设置为“mid + 1”
-
步骤6 − 否则,如果索引“mid”处的元素大于目标元素,则将“end”设置为“mid -1”
-
步骤7 − 否则,将“start”设置为“mid +1”,并返回“lastIndex”变量。
-
步骤8 − 现在,开始main()函数,并初始化整数数组以及要搜索的元素。
-
步骤9 − 现在,通过将所需参数传递给上面创建的函数来调用它,并将结果存储在变量中。
例子
在下面的例子中,我们将了解如何使用二进制搜索方法开发go语言程序来查找已排序切片中目标元素的最后一次出现。
package main
import (
"fmt"
)
func binarySearchLastOccurrence(slice []int, target int) int {
start := 0
end := len(slice) - 1
lastIndex := -1
for start <= end {
mid := (start + end) / 2
if slice[mid] == target {
lastIndex = mid
start = mid + 1
} else if slice[mid] > target {
end = mid - 1
} else {
start = mid + 1
}
}
return lastIndex
}
func main() {
nums := []int{10, 2, 5, 40, 7}
fmt.Println("给定的数组是:", nums)
var target int = 5
fmt.Println("要搜索的元素是:", target)
res := binarySearchLastOccurrence(nums, target)
fmt.Println("给定元素", target, "位于位置:", res)
}
输出
给定的数组是: [10 2 5 40 7]
要搜索的元素是: 5
给定元素 5 位于位置: 2
使用标准库函数
Go提供了一个名为sort.SearchInts的标准库函数,可用于查找已排序切片中目标元素的最后一次出现。 此函数在内部使用二进制搜索,并返回第一个大于或等于目标元素的元素的索引。
算法
- 首先,我们需要导入fmt和sort包。
-
然后创建名为lastIndexOfStandard()的函数,并使用已排序的slice nums和目标元素target调用sort.SearchInts函数
-
如果返回的索引i大于0且nums[i-1]等于目标元素,则返回i-1。否则,返回-1。
-
现在调用main()函数。在main()函数内,初始化数组以及要搜索的元素。
例子
在下面的例子中,我们将了解如何使用标准库函数来开发go语言程序,以查找已排序切片中目标元素的最后一次出现。
package main
import (
"fmt"
"sort"
)
func lastIndexOfStandard(nums []int, target int) int {
i := sort.SearchInts(nums, target)
if i >= 0 && nums[i] == target {
return i
} else {
return -1
}
}
func main() {
nums := []int{10, 20, 30, 40, 50}
fmt.Println("给定的数组为:", nums)
var target int = 40
fmt.Println("要查找的元素是:", target)
res := lastIndexOfStandard(nums, target)
fmt.Println("给定元素", target, "出现在位置:", res)
}
输出
给定的数组为:[10 20 30 40 50]
要查找的元素是:40
给定元素 40 出现在位置: 3
结论
在本文中,我们讨论了三种不同的方法来解决Golang中的这个问题。线性搜索方法最简单但效率最低,而二进制搜索和带递归的二进制搜索方法更有效但略微复杂。您可以根据切片的大小和目标元素出现的预期频率选择适合您用例的方法。