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 算法

Download history 63/week @ 2024-05-03 82/week @ 2024-05-10 35/week @ 2024-05-17 21/week @ 2024-05-24 22/week @ 2024-05-31 28/week @ 2024-06-07 211/week @ 2024-06-14 93/week @ 2024-06-21 30/week @ 2024-06-28 46/week @ 2024-07-05 32/week @ 2024-07-12 55/week @ 2024-07-19 302/week @ 2024-07-26 97/week @ 2024-08-02 54/week @ 2024-08-09 72/week @ 2024-08-16

每月下载 556 次
用于 5 个crate (3 直接使用)

MIT/Apache 许可

63KB
1K SLoC

naive_opt

crate Docs Rust Version Apache2/MIT licensed Test ubu Test mac Test win

优化后的朴素字符串搜索算法。

功能

  • 朴素字符串搜索算法
  • 增强了类似 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")]);
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上进行基准测试

变更日志

此crate的变更日志在此处。

参考

许可证

本项目可使用以下任一许可证:

由您选择。

依赖

~1MB
~22K SLoC