我需要创建一个整数列表,并能够快速添加,删除和查找该列表中的项目。虽然我可以创建一个包含它们的字符串和一个处理添加/删除/定位的函数,但是如果Go可以为我处理它显然更有意义。我查看了容器/清单,看起来并不完全合适,但也许我错了。
为了快速实现某些东西,我使用整数数组,但这远非理想,我需要找到更好的解决方案。该列表可能最多可容纳1,000个值。
有人可以建议最好的"在Go中处理这个问题的方法?一个例子值1000字。
答案 0 :(得分:4)
没有'最好'的方式来解决你的问题,因为你没有说明你想做什么或做什么
某种表现对你很重要。数据结构的问题在于每个结构
根据具体情况,表现更好或更差。一般来说,我会说一个整数切片
对于1000个条目表现相当不错,并且不是很难使用。解决方案尼克
建议很有吸引力,因为它为您的值提供O(1)
查找时间(平均!)而不是
<{1}}(未排序)或O(n)
(已排序)数组中的搜索时间。
Go提供了一些操作来实现您提议的O(log n)
商店:
[]int
x[i]
或x[i] = j
或使用已排序的插入x = append(x, j)
sort.SearchInts
,否则需要循环搜索并进行线性搜索。有关切片的更多操作,请参阅here。
以下示例(playground)为您提供x = append(x[:i], x[i+1:]...)
[]int
时间进行搜索,O(log n)
进行搜索。检索,删除和设置
当然,索引是O(n)
。
O(1)
正如您在示例中所看到的,type Ints []int
// Insert v so that ints is sorted
func (ints *Ints) Append(v int) {
i := sort.SearchInts(*ints, v)
*ints = append((*ints)[:i], append([]int{v}, (*ints)[i:]...)...)
}
// Delete by index
func (ints *Ints) Delete(i int) {
*ints = append((*ints)[:i], (*ints)[i+1:]...)
}
func (ints Ints) Search(v int) (int, bool) {
i := sort.SearchInts(ints, v)
return i, i < len(ints) && ints[i] == v
}
data := make(Ints, 0, 1000)
data.Append(100)
index,ok := data.Search(10)
搜索要插入新值的位置,具体取决于
在大小上,有效地按升序排序切片的内容。这使它成为可能
通过Append
使用二进制搜索,将搜索时间从sort.SearchInts
缩短为O(n)
。
随之而来的是插入时排序的成本,而这又是通过搜索插槽来完成的
在最坏的情况下,费用O(log n)
。因此,插入也是O(log n)
。
答案 1 :(得分:3)
为了保持简单,我会使用map。地图非常快速,高效且内置。
package main
import "fmt"
func main() {
// Make our collection of integers
xs := make(map[int]bool)
// Add some things to the collection
xs[1] = true
xs[2] = true
xs[3] = true
// Find them
if xs[2] {
fmt.Println("Found 2")
} else {
fmt.Println("Didn't Find 2")
}
if xs[8] {
fmt.Println("Found 8")
} else {
fmt.Println("Didn't Find 8")
}
// Delete them
delete(xs, 2)
// List them
for x := range xs {
fmt.Println("Contents", x)
}
}
哪个产生
Found 2 Didn't Find 8 Contents 3 Contents 1
这种解决方案的唯一缺点可能是整数不按任何特定顺序保存,这对您的应用程序可能有用,也可能不重要。
答案 2 :(得分:0)
这实际上更像是一个抽象的数据结构问题。答案取决于您的使用案例。对于一般情况,一片int就可以了(看append
等),但是如果你想要找到比O(n)更好的项目,那么你会希望它们被排序,然后插入排序的int[]
具有O(n)iirc的最坏情况。
所以问题是你想要优化,索引,添加,删除或搜索哪些?