23 个版本
0.1.25 | 2024年6月18日 |
---|---|
0.1.24 | 2023年8月4日 |
0.1.23 | 2023年2月13日 |
0.1.18 | 2022年6月13日 |
0.1.5 | 2021年3月20日 |
#122 in 算法
每月下载 556 次
用于 5 个crate (3 直接使用)
63KB
1K SLoC
naive_opt
优化后的朴素字符串搜索算法。
功能
- 朴素字符串搜索算法
- 增强了类似 libc++ 和 libstd++ string::find 的 1 字节搜索
- 专注于 UTF-8 字符串,这是 Rust 的一个特性
- ASCII 随机搜索
- 支持零开销特质。
- 支持忽略 ASCII 大小写匹配。
- 最小支持 rustc 1.56.1 (59eed8a2a 2021-11-01)
兼容性
这个crate旨在替换rust std库。但是,方法名不同,所以请重写你的代码。这不应该太难。
兼容性
rust std::str |
这个crate |
---|---|
std::str::find() |
naive_opt::搜索::search() |
std::str::rfind() |
naive_opt::搜索::rsearch() |
std::str::contains() |
naive_opt::搜索::includes() |
std::str::match_indices() |
naive_opt::搜索::search_indices() |
std::str::rmatch_indices() |
naive_opt::搜索::rsearch_indices() |
忽略 ASCII 大小写匹配
这个crate支持每个函数的 ASCII 不区分大小写的匹配。
这个crate |
---|
naive_opt::搜索::search_ignore_ascii_case() |
naive_opt::搜索::rsearch_ignore_ascii_case() |
naive_opt::搜索::includes_ignore_ascii_case() |
naive_opt::搜索::search_indices_ignore_ascii_case() |
naive_opt::搜索::rsearch_indices_ignore_ascii_case() |
示例
示例函数
use naive_opt::{string_search, string_rsearch};
use naive_opt::{string_search_indices, string_rsearch_indices};
let haystack = "111 a 111b";
let needle = "a";
let r = string_search(haystack, needle);
assert_eq!(r, Some(4));
assert_eq!(string_search(haystack, "1"), Some(0));
assert_eq!(string_rsearch(haystack, "1"), Some(8));
let v: Vec<_> = string_search_indices("abc345abc901abc", "abc").collect();
assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
let v: Vec<_> = string_rsearch_indices("abc345abc901abc", "abc").collect();
assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
示例特质:Search
use naive_opt::Search;
let haystack = "111 a 111b";
let needle = "a";
let r = haystack.search(needle);
assert_eq!(r, Some(4));
assert_eq!(haystack.search("1"), Some(0));
assert_eq!(haystack.rsearch("1"), Some(8));
let v: Vec<_> = "abc345abc901abc".search_indices("abc").collect();
assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
let v: Vec<_> = "abc345abc901abc".rsearch_indices("abc").collect();
assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
示例特质:SearchIn
use naive_opt::SearchIn;
let haystack = "111 a 111b";
let needle = "a";
let r = needle.search_in(haystack);
assert_eq!(r, Some(4));
assert_eq!("1".search_in(haystack), Some(0));
assert_eq!("1".rsearch_in(haystack), Some(8));
示例忽略 ASCII 大小写匹配
use naive_opt::Search;
let haystack = "111 a 111b";
let needle = "A";
let r = haystack.search_ignore_ascii_case(needle);
assert_eq!(r, Some(4));
assert_eq!(haystack.rsearch_ignore_ascii_case("A"), Some(4));
let v: Vec<_> = "abc345aBc901abc".search_indices_ignore_ascii_case("abc").collect();
assert_eq!(v, [(0, "abc"), (6, "aBc"), (12, "abc")]);
let v: Vec<_> = "abc345aBc901abc".rsearch_indices_ignore_ascii_case("abc").collect();
assert_eq!(v, [(12, "abc"), (6, "aBc"), (0, "abc")]);
assert_eq!("<A HREF=http://".includes_ignore_ascii_case("href"), true);
基准测试结果
- 使用 rustc 1.66.0 (69f9c33d7 2022-12-12) 编译
名称 |
bench:en |
bench:ja |
musl:en |
musl:ja |
---|---|---|---|---|
std_str_str | 757.800 μc | 521.920 μc | 728.020 μc | 520.580 μc |
std_string_string | 760.410 μc | 525.830 μc | 733.070 μc | 536.770 μc |
func_str_str | 102.100 μc | 121.790 μc | 122.460 μc | 122.300 μc |
func_string_string | 101.720 μc | 123.290 μc | 102.760 μc | 121.960 μc |
trait_str_str | 98.238 μc | 120.290 μc | 116.560 μc | 117.960 μc |
trait_string_string | 98.459 μc | 120.490 μc | 98.106 μc | 118.940 μc |
std_indices | 470.700 微克 | 370.070 微克 | 468.480 微克 | 392.680 微克 |
func_indices | 100.840 微克 | 118.750 微克 | 101.620 微克 | 146.220 微克 |
trait_indices | 100.920 微克 | 118.810 微克 | 101.070 微克 | 145.120 微克 |
- std 是 std::str::find()
us
是微秒:en
是英语的待查找字符串:ja
是日语的待查找字符串musl
是 x86_64-unknown-linux-musl- 在英特尔Q6600 @ 2.40GHz上进行基准测试
变更日志
参考
- 我的研究:字符串搜索算法
- 我的研究:字符串查找
- 维基百科:字符串搜索算法
memx
- rust crate,用于快速内存库
许可证
本项目可使用以下任一许可证:
- Apache License,版本2.0,(LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
由您选择。
依赖
~1MB
~22K SLoC