处理整数列表和 - 查找,添加和删除的最佳方法

时间:2013-04-12 18:44:43

标签: go

我需要创建一个整数列表,并能够快速添加,删除和查找该列表中的项目。虽然我可以创建一个包含它们的字符串和一个处理添加/删除/定位的函数,但是如果Go可以为我处理它显然更有意义。我查看了容器/清单,看起来并不完全合适,但也许我错了。

为了快速实现某些东西,我使用整数数组,但这远非理想,我需要找到更好的解决方案。该列表可能最多可容纳1,000个值。

有人可以建议最好的"在Go中处理这个问题的方法?一个例子值1000字。

3 个答案:

答案 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。地图非常快速,高效且内置。

playground link

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的最坏情况。

所以问题是你想要优化,索引,添加,删除或搜索哪些?