亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的紅黑樹實現基準測試顯示線性時間復雜度?

為什么我的紅黑樹實現基準測試顯示線性時間復雜度?

Go
白豬掌柜的 2023-07-10 17:17:38
這是我實現基準測試的方法,在本例中,它是基準測試Put操作:func BenchmarkRBTree(b *testing.B) {? ? for size := 0; size < 1000; size += 100 {? ? ? ? b.Run(fmt.Sprintf("size-%d", size), func(b *testing.B) {? ? ? ? ? ? tree := NewRBTree(func(a, b interface{}) bool {? ? ? ? ? ? ? ? if a.(int) < b.(int) {? ? ? ? ? ? ? ? ? ? return true? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? return false? ? ? ? ? ? })? ? ? ? ? ? for i := 0; i < b.N; i++ {? ? ? ? ? ? ? ? for n := 0; n < size; n++ {? ? ? ? ? ? ? ? ? ? tree.Put(n, n)? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? })? ? }}基準測試結果:BenchmarkRBTree/size-0-8? ? ? ? ? ? ? 2000000000? ? ? ? ? ? ? 0.49 ns/op? ? ? ? ? ? ? ?0 B/op? ? ? ? ? 0 allocs/opBenchmarkRBTree/size-100-8? ? ? ? ? ? ? ? 200000? ? ? ? ? ? ?11170 ns/op? ? ? ? ? ? 7984 B/op? ? ? ? 298 allocs/opBenchmarkRBTree/size-200-8? ? ? ? ? ? ? ? 100000? ? ? ? ? ? ?26450 ns/op? ? ? ? ? ?15984 B/op? ? ? ? 598 allocs/opBenchmarkRBTree/size-300-8? ? ? ? ? ? ? ? ?50000? ? ? ? ? ? ?38838 ns/op? ? ? ? ? ?23984 B/op? ? ? ? 898 allocs/opBenchmarkRBTree/size-400-8? ? ? ? ? ? ? ? ?30000? ? ? ? ? ? ?55460 ns/op? ? ? ? ? ?31984 B/op? ? ? ?1198 allocs/opBenchmarkRBTree/size-500-8? ? ? ? ? ? ? ? ?20000? ? ? ? ? ? ?62654 ns/op? ? ? ? ? ?39984 B/op? ? ? ?1498 allocs/opBenchmarkRBTree/size-600-8? ? ? ? ? ? ? ? ?20000? ? ? ? ? ? ?80317 ns/op? ? ? ? ? ?47984 B/op? ? ? ?1798 allocs/opBenchmarkRBTree/size-700-8? ? ? ? ? ? ? ? ?20000? ? ? ? ? ? ?91308 ns/op? ? ? ? ? ?55984 B/op? ? ? ?2098 allocs/opBenchmarkRBTree/size-800-8? ? ? ? ? ? ? ? ?10000? ? ? ? ? ? 106180 ns/op? ? ? ? ? ?63984 B/op? ? ? ?2398 allocs/opBenchmarkRBTree/size-900-8? ? ? ? ? ? ? ? ?10000? ? ? ? ? ? 121026 ns/op? ? ? ? ? ?71984 B/op? ? ? ?2698 allocs/op視覺折線圖ns/op:
查看完整描述

1 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

基準測試執行錯誤,正確版本:


func BenchmarkRBTree_Put(b *testing.B) {

    count := 0

    grow := 1

    for size := 0; size < 100000; size += 1 * grow {

        if count%10 == 0 {

            count = 1

            grow *= 10

        }

        b.Run(fmt.Sprintf("size-%d", size), func(b *testing.B) {

            // prepare problem size

            tree := NewRBTree(func(a, b interface{}) bool {

                if a.(int) < b.(int) {

                    return true

                }

                return false

            })

            for n := 0; n < size-1; n++ {

                tree.Put(n, n)

            }

            b.ResetTimer()

            for i := 0; i < b.N; i++ {

                tree.Put(size, size) // only measure the last operation

            }

        })

        count++

    }

}

http://img1.sycdn.imooc.com//64abccf30001a1d405940364.jpg

查看完整回答
反對 回復 2023-07-10
  • 1 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號