一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

[高效數(shù)據(jù)結構漫談]:HashMap與Vec的性能(1)

 godxiasad 2024-11-26 發(fā)布于北京

我都快忘記我還是碼農(nóng)了

遇上了一個問題,所以寫個文章記錄一下……

HashMap與Vec的性能

注意,因為這里主要用Rust來論述這個問題,如果對應到Python,就是dict與list,效果是一樣的。

看到這個問題,可能很多同學都會說,這個還要你說?HashMap的是基于kv結構的,查詢復雜度是O(1),而Vec的查詢復雜度是O(n),是個人都知道HashMap的復雜度高啊。
呵呵……圖樣圖森破,拿衣服……

看下面這個場景:

let size = 1000000;
let mut rng = rand::thread_rng();
let mut vec_info:Vec<(String,i32)> = Vec::with_capacity(size);
let mut hashmap_info:HashMap<usize,(String,i32)> = HashMap::with_capacity(size);

for i in 0..size{
//生成一個abc.abcde這樣格式的模擬名字
let name = format!("{}.{}",generate_random_string(rng.to_owned(),3),generate_random_string(rng.to_owned(),5));
//生成一個隨機年齡
let age = rng.gen_range(22..=60);
vec_info.push((name.to_owned(), age));
hashmap_info.insert(i, (name.to_owned(), age));
}
我分別定義了一個hashmap和一個vec,默認容量都是100萬
小貼士:在Rust、CPP一類編譯型語言中,預先對集合進行內(nèi)存分配,可以有效的提高內(nèi)存使用率和程序效率。
然后定義了一個數(shù)據(jù)結構,分別存儲了模擬的人員信息,例如一個姓名一個年齡,并且把這個數(shù)據(jù)存入到我們的hashmap和vec中,存進去的信息類似下面這種:

vec:

vec里面直接按照數(shù)值序列進行存儲,我們可以把序列號認為的ID
[
("iYP.NHqtJ", 24),
("Tr1.YITPi", 34),
("cMx.gkNIA", 58),
……
]

hashmap:

hashmap里面用kv模式存儲,序列號(ID)就是他們的key
{
0: ("iYP.NHqtJ", 24),
1: ("Tr1.YITPi", 34),
2: ("cMx.gkNIA", 58),
……
}

然后隨機讀取其中的1000個信息:

//隨機訪問vec中的1000個記錄
let start = Utc::now();
for i in 0..1000{
let idx = rng.gen_range(0..size);
println!("name= {} age = {}",vec_info[idx].0,vec_info[idx].1);
}
let end = Utc::now();
let vec_o = end.timestamp_subsec_micros()-start.timestamp_subsec_micros();

//隨機訪問hashmap中的1000個記錄
let start = Utc::now();
let start = Utc::now();
for i in 0..1000{
let idx = rng.gen_range(0..size);
println!("{:?}",hashmap_info[&idx]);
}
let end = Utc::now();

在debug模式下,執(zhí)行結果如下:

?。?!

vec的下標隨機訪問,100萬里面獲取其中的1000條,比hashmap通過key進行隨機訪問,快了20%效率。

實際上,我們回憶一下數(shù)據(jù)結構,大家就能想起來,原文是這樣說的:
?HashMap?是一種基于哈希表的數(shù)據(jù)結構,用于存儲鍵值對(key-value pairs),其中每個鍵都是唯一的。HashMap提供了快速查找、插入和刪除操作,平均時間復雜度為O(1)。
注意,理論上,hashmap是O(1)的,但是在具體實現(xiàn)的時候,不同的語言設計會出現(xiàn)一定的開銷,而vec的下標訪問,幾乎是無開銷的直接訪問內(nèi)存,所以性能高了差不多20%。
說到這里,如果有同學要Java做同類的測試,發(fā)現(xiàn)hashmap的性能可能更慘,是因為Java的HashMap實現(xiàn)用的是紅黑樹來實現(xiàn)的,而紅黑樹的查詢復雜度是O(logn)……
接下去看看,遍歷的性能:
我們直接遍歷整個集合,并且取出來每個數(shù)值,這里就不進行print了,因為print的開銷還是挺大的,會卡半天,結果如下:

vec進行全集合遍歷的性能,幾乎是比hashmap遍歷快了230%……

結論:

如果是通過下標直接訪問,或者遇上需要遍歷全部信息的情況下,vec的性能要比hashmap更好。
那么如果是增加刪除修改呢?誰的性能更好?請聽下回分解。

    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲国产成人久久一区二区三区| 五月天丁香婷婷狠狠爱| 丝袜诱惑一区二区三区| 亚洲一区二区三区三区| 在线视频免费看你懂的| 麻豆视传媒短视频在线看| 婷婷色网视频在线播放| 国产情侣激情在线对白| 国产一区欧美一区日韩一区| 亚洲欧美日韩精品永久| 色婷婷视频国产一区视频| 亚洲夫妻性生活免费视频| 国产毛片不卡视频在线| 熟女乱一区二区三区四区| 91欧美日韩一区人妻少妇| 色欧美一区二区三区在线| 欧美日韩综合在线第一页| 日本欧美一区二区三区在线播| av国产熟妇露脸在线观看| 国产成人精品视频一区二区三区| 午夜资源在线观看免费高清| 老司机激情五月天在线不卡| 日本少妇三级三级三级| 久久精品欧美一区二区三不卡| 欧美国产亚洲一区二区三区| 日韩欧美国产精品自拍| 欧美色欧美亚洲日在线| 欧美一级黄片欧美精品| 暴力三级a特黄在线观看| 亚洲欧美日本视频一区二区| 果冻传媒在线观看免费高清| 日韩av亚洲一区二区三区| 欧美精品二区中文乱码字幕高清| 色无极东京热男人的天堂| 午夜福利视频偷拍91| 欧美黑人在线精品极品| 91日韩在线观看你懂的| 中文字幕久久精品亚洲乱码| 亚洲午夜av久久久精品| 亚洲最新一区二区三区| 麻豆剧果冻传媒一二三区|