检查 Rust 中向量中是否存在某些内容的最快方法是什么?
What is the fastest way to check if something exist in a vector in Rust?
我在文本文件中有大量数据。我读取了文本文件并将每一行添加到一个向量中,但是当我使用 contain 方法检查该向量中是否存在某些字符串时,应用程序变慢了。我在 python 中用 pickle 看到了相同的功能,它非常快。如何更快地检查向量中是否存在某些内容?
为了 .contains()
在 Vec 中找到一个元素,它必须遍历每个元素并将该元素与搜索字符串进行比较以检查它是否存在。您可以进行的最简单的优化是改用 HashMap,其中键是您要搜索的字符串,值可以是 ()
,因为它并不重要。然后,您可以使用 .get()
搜索给定的字符串,如果它包含在地图中则得到 Some(())
否则得到 None
。可以遍历 hashmap 的所有元素,因此您仍然可以检索所有存储的值,但您将获得更快的搜索能力
我实现了二进制搜索,它变得非常快。好得令人难以置信。
fn main() {
let mut v: Vec<String> = Vec::new();
v.push("afd".to_string());
v.push("zdgdg".to_string());
v.push("bvbvb".to_string());
v.sort_unstable();
println!("{:?}", v);
match v.binary_search(&"bvbvb".to_string()) {
Ok(u) => {
println!("yes {}", u)
}
Err(e) => {
println!("No {}", e)
}
}
}
我在文本文件中有大量数据。我读取了文本文件并将每一行添加到一个向量中,但是当我使用 contain 方法检查该向量中是否存在某些字符串时,应用程序变慢了。我在 python 中用 pickle 看到了相同的功能,它非常快。如何更快地检查向量中是否存在某些内容?
为了 .contains()
在 Vec 中找到一个元素,它必须遍历每个元素并将该元素与搜索字符串进行比较以检查它是否存在。您可以进行的最简单的优化是改用 HashMap,其中键是您要搜索的字符串,值可以是 ()
,因为它并不重要。然后,您可以使用 .get()
搜索给定的字符串,如果它包含在地图中则得到 Some(())
否则得到 None
。可以遍历 hashmap 的所有元素,因此您仍然可以检索所有存储的值,但您将获得更快的搜索能力
我实现了二进制搜索,它变得非常快。好得令人难以置信。
fn main() {
let mut v: Vec<String> = Vec::new();
v.push("afd".to_string());
v.push("zdgdg".to_string());
v.push("bvbvb".to_string());
v.sort_unstable();
println!("{:?}", v);
match v.binary_search(&"bvbvb".to_string()) {
Ok(u) => {
println!("yes {}", u)
}
Err(e) => {
println!("No {}", e)
}
}
}