9 个版本

0.3.1 2024 年 8 月 22 日
0.3.0 2024 年 8 月 8 日
0.2.0 2024 年 8 月 7 日
0.1.5 2024 年 8 月 7 日

#253算法

Download history 505/week @ 2024-08-02 77/week @ 2024-08-09 100/week @ 2024-08-16

每月 <682 次下载

MIT/Apache

24KB
309

github crates.io docs.rs tests

模糊前缀搜索

Rust 中用于模糊前缀字符串搜索和自动完成的灵活字典树实现。

文档

功能

  • 基于前缀的模糊搜索(Levenshtein 距离)
  • 可自定义编辑距离的模糊搜索
  • 每个单词可以关联多个数据
  • 为搜索结果使用 Jaro-Winkler 相似度评分
  • 线程安全
  • 无依赖

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
fuzzy_prefix_search = "0.2"

用法

以下是如何使用模糊前缀搜索的快速示例

use fuzzy_prefix_search::Trie;

fn main() {
    let mut trie = Trie::new();

    // Insert words with associated data
    trie.insert("apple", 1);
    trie.insert("application", 2);
    trie.insert("appetite", 3);

    // Perform a fuzzy search
    let results = trie.search_within_distance("appl", 1);

    for result in results {
        println!("Word: {}, Data: {:?}", result.word, result.data);
    }

    // Search with similarity scoring
    let scored_results = trie.search_within_distance_scored("aple", 2);

    for result in scored_results {
        println!("Word: {}, Data: {:?}, Score: {}", result.word, result.data, result.score);
    }
}

高级用法

自定义数据类型

字典树支持任何实现了 CloneDefaultPartialEqEqHash 的数据类型

#[derive(Clone, Default, PartialEq, Eq, Hash)]
struct CustomData {
    id: u32,
    value: String,
}

let mut trie = Trie::new();
trie.insert("example", CustomData { id: 1, value: "Test".to_string() });

删除数据

您可以删除特定数据值的所有出现

trie.remove_all(&2);

性能

  • 插入的时间复杂度为 O(k),其中 k 是单词的长度
  • 使用具有共享前缀的树结构高效存储空间
  • TODO:基准测试、优化、算法选择...

注意:为了获得比 Rc/RefCell 方法快两倍的读取性能,我们在删除时使用了 不安全 的操作。

贡献

欢迎贡献!请随意提交拉取请求。

资源

许可证

本项目受 MIT 或 Apache 2.0 许可证的许可 - 有关详细信息,请参阅 LICENSE 文件。

无运行时依赖