19个版本

0.3.26 2024年8月5日
0.3.25 2024年8月5日
0.3.23 2024年3月9日
0.3.13 2024年2月28日
0.3.10 2023年5月23日

#161 in 算法

Download history 15/week @ 2024-05-03 17/week @ 2024-05-10 30/week @ 2024-05-17 67/week @ 2024-05-24 22/week @ 2024-05-31 20/week @ 2024-06-07 38/week @ 2024-06-14 64/week @ 2024-06-21 59/week @ 2024-06-28 81/week @ 2024-07-05 30/week @ 2024-07-12 184/week @ 2024-07-19 170/week @ 2024-07-26 484/week @ 2024-08-02 263/week @ 2024-08-09 72/week @ 2024-08-16

每月 1,016 次下载
用于 4 个crate(通过 two_percent

MIT 许可证

79KB
2K SLoC

Crates.io

模糊匹配器

Rust中的模糊匹配算法!

用法

在您的Cargo.toml中添加以下内容

[dependencies]
fuzzy-matcher = "*"

以下是一些代码示例

use fuzzy_matcher::FuzzyMatcher;
use fuzzy_matcher::skim::SkimMatcherV2;

let matcher = SkimMatcherV2::default();
assert_eq!(None, matcher.fuzzy_match("abc", "abx"));
assert!(matcher.fuzzy_match("axbycz", "abc").is_some());
assert!(matcher.fuzzy_match("axbycz", "xyz").is_some());

let (score, indices) = matcher.fuzzy_indices("axbycz", "abc").unwrap();
assert_eq!(indices, [0, 2, 4]);
  • fuzzy_match 只返回分数,而 fuzzy_indices 则返回匹配的索引。
  • 这两个函数如果模式不匹配则返回 None。
  • 分数越高越好。

更多示例

echo "axbycz" | cargo run --example fz "abc" 查看会发生什么。

关于算法

浏览

浏览器当前由 skim 使用,这是一个模糊查找器。

浏览V2

  • 就像fzf v2一样,算法基于Smith-Waterman算法,通常用于DNA序列比对。
  • 有关更多详细信息,请参阅 https://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/gaps.pdf
  • 时间复杂度为 O(mn),其中 m, n 是模式和输入行的长度。
  • 对于 fuzzy_indices,空间复杂度为 O(mn),而对于 fuzzy_match,空间复杂度为 O(2n),这将压缩动态规划的表。
  • V2匹配器有一个选项可以设置分数矩阵的最大元素,如果 m*n 超过限制,它将回退到线性搜索。

浏览V1

Clangd

  • 该算法基于 clangd的FuzzyMatch.cpp
  • 还可以查看 https://github.com/lewang/flx/issues/98 以了解一些变体。
  • 算法的时间复杂度为 O(mn),其中 m, n 分别是模式长度和输入行的长度。
  • 对于 fuzzy_indices,空间复杂度为 O(mn),而对于 fuzzy_match,空间复杂度为 O(2n),这将压缩动态规划的表。

依赖关系

~86KB