所以我必须用编译成本机代码的语言实现一些数据结构。我是用C ++做的,但现在我想尝试另一种语言,我以前没用过。我选择golang
。第一个数据结构是一个数组(能够动态追加,删除等)。在C ++中,我有这样的结论:
class array{
int n;
int *t;
.
.
.
}
所以n
是元素的数量,*t
是指向数组的指针,它将在构造函数中创建。我写了append
,pop_back
,remove
,find
方法等等。现在,当我切换到golang时,我的第一次尝试是创建一个struct
这样的东西:
type array struct {
n int
...
}
而且我不知道这里应该是什么而不是点。所以我做了一些阅读(得到了Brian W. Kernighan的书),我找到了大约2种数据类型:arrays
和slices
。我发现了一段代码用于追加数组(取一个数组,调整它(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
时代不同。现在我的问题是:
O(1)
,因此有多少参数无关紧要?