1 个不稳定版本
0.1.1 | 2023年12月12日 |
---|
#2432 在 算法
58 每月下载次数
165KB
3.5K SLoC
📐 norm
norm是字符串上的不同距离度量的集合。这个问题有时被称为“字符串相似度搜索”,或者更通俗地称为“模糊匹配”。
可用度量
FzfV1
:fzf在启动时使用--algo=v1
时使用的算法的端口;FzfV2
:fzf在没有任何额外标志或使用--algo=v2
时使用的算法的端口;
性能
性能是该crate的首要任务。我们的目标是提供每个度量算法的最快实现,跨越所有语言。 这里可以找到一些基准测试,比较norm的度量之间,以及与其他流行库之间的性能。
示例用法
use std::ops::Range;
use norm::fzf::{FzfParser, FzfV2};
use norm::Metric;
let mut fzf = FzfV2::new();
let mut parser = FzfParser::new();
let query = parser.parse("aa");
let cities = ["Geneva", "Ulaanbaatar", "New York City", "Adelaide"];
let mut results = cities
.iter()
.copied()
.filter_map(|city| fzf.distance(query, city).map(|dist| (city, dist)))
.collect::<Vec<_>>();
// We sort the results by distance in ascending order, so that the best match
// will be at the front of the vector.
results.sort_by_key(|(_city, dist)| *dist);
assert_eq!(results.len(), 2);
assert_eq!(results[0].0, "Adelaide");
assert_eq!(results[1].0, "Ulaanbaatar");
// We can also find out which sub-strings of each candidate matched the query.
let mut ranges: Vec<Range<usize>> = Vec::new();
let _ = fzf.distance_and_ranges(query, results[0].0, &mut ranges);
assert_eq!(ranges.len(), 2);
assert_eq!(ranges[0], 0..1); // "A" in "Adelaide"
assert_eq!(ranges[1], 4..5); // "a" in "Adelaide"
ranges.clear();
let _ = fzf.distance_and_ranges(query, results[1].0, &mut ranges);
assert_eq!(ranges.len(), 1);
assert_eq!(ranges[0], 2..4); // The first "aa" in "Ulaanbaatar"
依赖项
~170–310KB