最近更新:28th 十二月, 2016

很多时候,我们需要在字符串中执行查找,以判断过滤指定的内容出来。比如过在落格输入法当中,就需要用辅码过滤出需要的候选词。

一般来说,查找和对比肯定是数字来的最快,不过在词库上总不能把所有的词汇都转换为数字(虽然理论上可行……)在字符串的搜索上,我们有很多种办法来实现,这里我就说一下我自己的思路:

Set<String>

由于我的词库辅码筛选只对两字或者三字词汇生效,那么我考虑把它们作为集合(Set)来检测,把词汇拆成单字。很遗憾,不说拆分的单独开销,本以为哈希表的set集合会很快,但速度并不行,可能它的优势是在于大量的时候吧,不过很可惜,它的速度是最慢的。

我用一个简短的集合来多次遍历然后统计时间,得到结果如下:

1
2
3
4
5
6
7

let ptime = Date ( ) . timeIntervalSince1970
let b : Set < String > = [ "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" ]
for _ in ( 0 ... 9999999 ) {
     _ = b . contains ( "hb" )
}
let during = Date ( ) . timeIntervalSince1970 - ptime
print ( during )

结果 8.90186786651611 值得一提的是,无论是命中还是丢失,速度是一样的。当然,速度慢也得考虑字符串比较自身的开销问题。

a.contains(“a”)

字符串自带了包含方法,它可以检测字符串 a 中是否包含了 "a" ,如果包含了,就返回 true 。这是很直接的办法:

1
2
3
4
5
6
7

let a = "abcdefgh"
let ptime = Date ( ) . timeIntervalSince1970
for _ in ( 0 ... 9999999 ) {
     a . contains ( "a" )
}
let during = Date ( ) . timeIntervalSince1970 - ptime
print ( during )

用这样简单的遍历得到结果 7.06464505195618 秒。

那么能不能更快一些呢?我们换一种思路,如果说我们仅仅是查找,那其实还有一种方法可以考虑,那就是

a.range(of: “a”)

Swift 中 String  还有一个自带的方案,那就是获取指定字符串在另一字符串的范围,用来提取活着修改字符串用,如果找不到,那么就返回 nil 。

这里我们用返回值是否为空来判断字符串是否包含,速度会是多少呢?

1
2
3
4
5
6
7

let a = "abcdefgh"
let ptime = Date ( ) . timeIntervalSince1970
for _ in ( 0 ... 9999999 ) {
   _ = a . range ( of : "ah" )
}
let during = Date ( ) . timeIntervalSince1970 - ptime
print ( during )

执行的结果是 6.38309478759766 秒。显然,这种方法的查找速度是比上边两种专门的查找要快的。

在字符串中 快速查找相关推荐

  1. 查找字符串中要查找的字符串最后一次出现的位置

    C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <stdio.h> #i ...

  2. php对pdf关键字定位,如何在PDF文件中快速查找关键字

    有时候我们在阅读和编辑PDF文章时需要对PDF文件里的重要关键词进行查找,但如果PDF文章内容过长,怎么才能快速查找出想要查找的关键字? 想要在PDF文件中快速查找出关键字,那么利用迅捷PDF编辑器进 ...

  3. c 语言字符串查找替换,c ++ - 如何在标准字符串中搜索/查找和替换?

    c ++ - 如何在标准字符串中搜索/查找和替换? 有没有办法用std::string中的另一个字符串替换所有出现的子字符串? 例如: void SomeFunction(std::string&am ...

  4. Cadence OrCAD原理图中快速查找元件的方法

    Cadence OrCAD原理图中快速查找元件和网络方法 本章节将教大家如何在OrCAD原理图中根据元件位号快速查找元件的两个方法. 方法一:在.obj页面的"File"标签下查找 ...

  5. centos7 vim查找_如何在 Vim/Vi 中快速查找和替换文本内容

    Vim 是 Vi 多模式命令行编辑器的加强版,通常默认的Unix或Linux系统中都默认自带Vi命令编辑器.当然,为了更好的体验,如果系统默认没有安装Vim,建议安装Vim. 通过本文的讲解,你将学会 ...

  6. 如何在 Windows 中快速查找文档

    近几年,随着硬盘介质价格的大幅度下降,各位电脑迷们的个人硬盘容量越来越大,动辄五六十G,甚至上百G都不足为奇,这在前几年是无法想象的.但是硬盘大了,存放的文档多了,查找速度慢的烦恼也随之来了.其实在W ...

  7. 索引:如何在海量数据中快速查找某个数据?

    ------ 本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 ------ 前面讲过MySQL数据库索引实现原理,底层是依赖B+树这种数据结构来实现的.那类似Redisp 这 ...

  8. 【索引】:如何在海量数据中快速查找某个数据?

    亲测可用,若有疑问请私信 在[B+树]:MySQL数据库索引是如何实现的?中,我们讲了MySQL数据库索引的实现原理.MySQL底层依赖的是B+树这种数据结构.那类似Redis这样的Key-Value ...

  9. LeetCode 833. 字符串中的查找与替换(排序,replace)

    文章目录 1. 题目 2. 解题 1. 题目 某个字符串 S 需要执行一些替换操作,用新的字母组替换原有的字母组(不一定大小相同). 每个替换操作具有 3 个参数:起始索引 i,源字 x 和目标字 y ...

最新文章

  1. 想要升职加薪?先管理好时间与目标!
  2. 浅析面包屑导航对网站SEO优化有哪些作用?
  3. python 数据验证
  4. Linux 线程实现机制分析--转
  5. [ARM-assembly]-ARMV8的exclusive和inexclusive的介绍
  6. 2008 mysql 本地安全_如何在Linux系统中建立mysql的本地安全机制?
  7. CloudFoundry的cf push命令执行后,背后发生了什么
  8. MATLAB警告: 矩阵为奇异工作精度
  9. 机器学习笔记(常见算法)
  10. module_param的使用
  11. php中sha1,PHP中sha1()函数和md5()函数的绕过
  12. 安卓案例:Okhttp3用法演示
  13. onbeforeedit和onbeginedit数据不一致_深度解读,奔溃一致性、应用一致性的区别
  14. JDK8新特性(四)之方法引用
  15. SQL条件!=null查不出数据
  16. 网络协议和Netty
  17. 速达3000怎么找不到服务器,速达软件服务器无法启动怎么办?
  18. Deap框架—结合demo进行学习
  19. PCL库——点云数据处理
  20. 关于如何让网站被搜索引擎收录

热门文章

  1. Qt 主窗口不能最大化
  2. Win10、11登录微软账户时一直转圈
  3. 如何在windows11系统中打开ie11浏览网页
  4. windows11 scp
  5. OpenStack之Nova分析——Nova API服务
  6. 计算机图形学14:三维图形的投影变换
  7. 微信硬件平台蓝牙打印机
  8. 靠谱的录屏软件 + mp4格式转换软件
  9. Cesium实时目标跟踪最新特效教程系列1—实时发亮直线跟踪移动目标
  10. 使用hicanu组装hifi基因组的方法介绍