第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

緩存復(fù)雜數(shù)據(jù)的最佳方式

緩存復(fù)雜數(shù)據(jù)的最佳方式

Go
寶慕林4294392 2023-05-15 15:37:51
我有一張表,用于根據(jù)號(hào)碼前綴存儲(chǔ)語(yǔ)音通話的費(fèi)用:Prefix  ratio 44      0.01597447     0.04958447530  0.03447531  0.048447532  0.049501       0.197      0.1在表中查找數(shù)字前綴并不復(fù)雜,因?yàn)樾枰畲笃ヅ淝熬Y。例如4475122112 的前綴是447,4475302112 的前綴是 447530我想將表緩存在內(nèi)存中,以通過(guò)減少數(shù)據(jù)庫(kù)交互來(lái)提高性能。由于獲取數(shù)字前綴(然后是它的速率)需要在緩存上進(jìn)行搜索我找到了兩種方法:將它們存儲(chǔ)在純映射中。在地圖上搜索可以像掃描所有地圖一樣簡(jiǎn)單(也許是懶惰的)。將鏈表結(jié)構(gòu)創(chuàng)建為樹(shù)。而短前綴接近根,最長(zhǎng)前綴接近葉子?,F(xiàn)在,緩存此類數(shù)據(jù)的最佳方式是什么?或者有沒(méi)有其他機(jī)制?
查看完整描述

1 回答

?
狐的傳說(shuō)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

將它們存儲(chǔ)在地圖中,然后嘗試您要查找其費(fèi)用的號(hào)碼。如果數(shù)字(鍵)不在地圖中,則切斷其最后一位數(shù)字并重復(fù)。這樣,如果您找到匹配項(xiàng),則可以保證這將是最長(zhǎng)的前綴。


這是一個(gè)示例查找函數(shù):


var prefixCostMap = map[uint64]float64{

    44:     0.01597,

    447:    0.04958,

    447530: 0.03,

    447531: 0.048,

    447532: 0.04950,

    1:      0.1,

    97:     0.1,

}


func lookup(num uint64) (longestPrefix uint64, cost float64, ok bool) {

    longestPrefix = num


    for longestPrefix > 0 {

        cost, ok = prefixCostMap[longestPrefix]

        if ok {

            break

        }

        longestPrefix = longestPrefix / 10 // Cut off last digit

    }


    return

}

測(cè)試它:


fmt.Println(lookup(4475122112))

fmt.Println(lookup(4475302112))

fmt.Println(lookup(999))

輸出(在Go Playground上嘗試):


447 0.04958 true

447530 0.03 true

0 0 false

注意:這不支持以 0 開(kāi)頭的數(shù)字。如果您還需要處理它,您可以將數(shù)字存儲(chǔ)為字符串值,這樣初始0數(shù)字將被保留。


這是string版本的樣子:


var prefixCostMap = map[string]float64{

    "44":     0.01597,

    "447":    0.04958,

    "447530": 0.03,

    "447531": 0.048,

    "447532": 0.04950,

    "1":      0.1,

    "97":     0.1,

    "0123":   0.05,

}


func lookup(num string) (longestPrefix string, cost float64, ok bool) {

    longestPrefix = num


    for longestPrefix != "" {

        cost, ok = prefixCostMap[longestPrefix]

        if ok {

            break

        }

        longestPrefix = longestPrefix[:len(longestPrefix)-1] // Cut off last digit

    }


    return

}

測(cè)試它:


fmt.Println(lookup("4475122112"))

fmt.Println(lookup("4475302112"))

fmt.Println(lookup("999"))

fmt.Println(lookup("0123456"))

輸出(在Go Playground上嘗試):


447 0.04958 true

447530 0.03 true

 0 false

0123 0.05 true


查看完整回答
反對(duì) 回復(fù) 2023-05-15
  • 1 回答
  • 0 關(guān)注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)