在golang中实现数据结构

时间:2017-03-25 22:38:31

标签: arrays go slice

所以我必须用编译成本机代码的语言实现一些数据结构。我是用C ++做的,但现在我想尝试另一种语言,我以前没用过。我选择golang。第一个数据结构是一个数组(能够动态追加,删除等)。在C ++中,我有这样的结论:

class array{
    int n;
    int *t;
    .
    .
    .
}

所以n是元素的数量,*t是指向数组的指针,它将在构造函数中创建。我写了appendpop_backremovefind方法等等。现在,当我切换到golang时,我的第一次尝试是创建一个struct这样的东西:

type array struct {
    n int
    ...
}

而且我不知道这里应该是什么而不是点。所以我做了一些阅读(得到了Brian W. Kernighan的书),我找到了大约2种数据类型:arraysslices。我发现了一段代码用于追加数组(取一个数组,调整它(n + 1)并插入一个值)。我测试了它,有效(我在内置的slice类型上测试过它)。现在,当我拥有自己的数组类型时,我不知道是否应该使用slice,或者其他可能的东西。我有这段代码,它将测量Append()操作的时间,具体取决于元素的数量:

package main

import (
    "fmt"
    "time"
)

type array struct {
    n int
}
func Append(slice []int, element int) []int {
    n := len(slice)
    total := len(slice) + 1
    if total > cap(slice) {
        // Reallocate. Grow to 1.5 times the new size, so we can still grow.
        newSize := total*3/2 + 1
        newSlice := make([]int, total, newSize)
        copy(newSlice, slice)
        slice = newSlice
    }
    slice = slice[:total]
    slice[n] = element
    return slice
}

func main() {
    var seconds int64 = 0
    sizes := [5]int64{1000, 5000, 10000, 50000, 100000}
    for i := 0; i < 5; i++ {
        var j int64
        for j = 0; j < 100; j++ {
            array := make([]int, sizes[i], sizes[i]+1)
            start := time.Now()
            array = Append(array, 1)
            elapsed := time.Since(start)
            seconds += int64(elapsed)
        }
        seconds = seconds/100
        fmt.Println(seconds)
        seconds = 0
    }
    fmt.Println("The end")
}

我总是array := make([]int, sizes[i], sizes[i]+1)因为我不想让容量改变和复制在这里相关。据我所知,如果数组有1000个元素或100000个应该没有区别 - 时间应该大致相同,但我得到的结果是不同的:

1810
1589
46
99
244
The end

时代不同。现在我的问题是:

  1. 我应该在自己的数组类型中使用什么基本类型?
  2. 我可以以某种方式重新分配内存(增加/减少长度)而不对容量进行操作吗?
  3. 有没有办法更改此算法以使其计算复杂度O(1),因此有多少参数无关紧要?

0 个答案:

没有答案