2013-01-21 69 views
2

請看下面的例子:sort.SearchInts奇怪的工作或我失去了一些東西

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 
} 

回答

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

1

SearchInts在INTS的分類片X的搜索,並返回由搜索指定的索引。 SearchInts電話Search與功能:

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

從搜索文檔引用:

搜索使用二進制搜索找到,並在其中,f返回在[0,N),我最小的指數( i)爲真,假設在範圍[0,n), f(i)== true意味着f(i + 1)== true。也就是說,搜索要求對於輸入範圍[0,n) 的某些(可能爲空)前綴,f 爲假,對於(可能爲空)餘數爲真;搜索返回第一個真實索引 。如果沒有這樣的索引,Search返回n。搜索 僅在[0,n)範圍內調用f(i)。

所以基本上,你會得到一個索引,其中應該插入你搜索的數字,以便切片保持排序。

只要檢查在返回的索引切片中的數字是否與您搜索的數字相同。

2

這似乎是一個功能奇特的功能,但它的記錄:

例如,假定按升序排序切片數據,調用 搜索(LEN(數據),FUNC(I INT)BOOL {返回數據[i]> = 23})返回 最小的索引i,使得data [i]> = 23。

顯而易見的解決方案還記載:

如果主叫方想要 找到23是否處於切片,它必須測試數據[I] == 23 分開。

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像你這樣的建議。

相關問題