私はいくつかの基本的なアルゴリズムを学び/理解しようとしていますが、今日はGoにバイナリツリーを書くことにしました。これは、構造体は次のようになります。なぜこのバイナリツリーの検索に挿入よりも時間がかかりますか?
type Node struct {
Value int
Left *Node
Right *Node
}
ここで木がintが含まれているかどうかを確認するために私の機能です:
func (tree *Node) Contains(val int) bool {
if val == tree.Value {
return true
} else if val > tree.Value {
if tree.Right != nil {
return tree.Right.Contains(val)
} else {
return false
}
} else if val < tree.Value {
if tree.Left != nil {
return tree.Left.Contains(val)
} else {
return false
}
} else { // huh
return false
}
}
私は木のテイクにどのくらい異なる操作をテストするためのテスト機能を書きました。 Insert()
関数34msに100,000個のランダムな整数を挿入するには、Contains()
関数33msを使用して、ツリーに100,000の乱数が含まれているかどうかを確認します。ランダムな整数の数を1,000,000まで上げると、Insert()
関数34msが実行されますが、私のContains()
関数は突然321msを実行します。
なぜContains()
の実行時間が大幅に増加するのですが、Insert()
は実質的に同じですか?
どこに 'insert'関数がありますか? – Nevermore
使用しているベンチマーク機能を表示できますか? – JimB
時間を計る前に5〜10回実行しておく必要があります。実行時にJava(JIT)などの言語が最適化を行うことはありませんが、マイクロベンチマークは難しいです。 – Elbek