sort.SearchInts工作奇怪,或者我错过了什么

时间:2013-01-21 10:34:39

标签: go

考虑以下示例:

package main

import (
    "fmt"
    "sort"
)

func main() {
    var n int
    var a sort.IntSlice
    a = append(a, 23)   
    a = append(a, 3)
    a = append(a, 10)
    sort.Sort(a)    
    fmt.Println(a)
    n = sort.SearchInts(a, 1)
    fmt.Println(n)
    n = sort.SearchInts(a, 3)
    fmt.Println(n)
}

http://play.golang.org/p/wo4r43Zghv

结果是:

[3 10 23]
0
0

当第一个元素和不存在的元素都返回0作为索引时,我怎么知道切片中是否存在数字?

更新 请注意,索引也可以大于切片的长度,因此查找切片中是否存在元素的正确方法是:

num := 1
n = sort.SearchInts(a, num) 
if n < len(a) && a[n] == num {
  // found
}

4 个答案:

答案 0 :(得分:2)

这似乎是一个功能奇怪的功能,但它已记录在案:

  

例如,给定按升序排序的切片数据,调用   搜索(len(data),func(i int)bool {return data [i]&gt; = 23})返回   最小的索引i使得data [i]> = 23.

还记录了明显的解决方案:

  

如果来电者想要   找到23是否在切片中,它必须测试数据[i] == 23   分开。

答案 1 :(得分:1)

检查您要查找的号码是否实际存在于返回的索引中。 binary search routines in sort应该找到可以插入值的索引(如果它尚未存在)。

E.g。在示例will return 3中的切片中搜索100,因为该值必须附加到切片。

  

调用Search(len(data), func(i int) bool { return data[i] >= 23 })返回最小的索引i,使data[i] >= 23。如果调用者想要查找23是否在切片中,则必须单独测试data[i] == 23

答案 2 :(得分:1)

SearchInts在排序的整数切片中搜索x,并返回搜索指定的索引。 SearchInts使用函数调用Search

func(i int) bool { return a[i] >= x }

从搜索文档引用:

  

搜索使用二进制搜索来查找并返回[0,n]中f(i)为真的最小索引i,假设在[0,n]范围内,   f(i)== true表示f(i + 1)== true。也就是说,搜索需要f   输入范围[0,n]的某些(可能为空)前缀为false   然后对于(可能是空的)余数是真的;搜索返回   第一个真实指数。如果没有这样的索引,则搜索返回n。搜索   仅在[0,n)范围内调用f(i)。

所以基本上你会找回一个索引,你应该插入你搜索过的数字,这样切片就会保持排序。

只需检查返回的索引处的切片中的数字是否与您搜索的数字相同。

答案 3 :(得分:0)

此代码段来自文档:

x := 23
i := sort.Search(len(data), func(i int) bool { return data[i] >= x })
if i < len(data) && data[i] == x {
    // x is present at data[i]
} else {
    // x is not present in data,
    // but i is the index where it would be inserted.
}

http://golang.org/pkg/sort/#Search

所以你必须按照你的建议检查i < len(data) && data[i] == x