strstr 的优化版本(搜索具有恒定长度)

2023-11-21

我的 C 程序有很多 strstr 函数调用。标准库 strstr 已经很快,但在我的例子中,搜索字符串的长度始终为 5 个字符。我用一个特殊版本替换了它以获得一些速度:



int strstr5(const char *cs, const char *ct)
{
    while (cs[4]) {

        if (cs[0] == ct[0] && cs[1] == ct[1] && cs[2] == ct[2] && cs[3] == ct[3] && cs[4] == ct[4])
            return 1;

        cs++;
    }

    return 0;
}
  

该函数返回一个整数,因为它足以知道 ct 是否出现在 cs 中。在这种特殊情况下,我的函数比标准 strstr 更简单、更快,但我很想听听是否有人有一些可以应用的性能改进。即使是很小的改进也是受欢迎的。

Summary:

  • cs 的长度 >=10,但其他方面可能会有所不同。长度之前已知(在我的函数中未使用)。 cs的长度通常为100到200。
  • ct 的长度为 5
  • 字符串的内容可以是任何内容

编辑:感谢您的所有回答和评论。我必须研究和测试想法,看看什么最有效。我将从 MAK 关于后缀 trie 的想法开始。


有几个快的字符串搜索算法。尝试看看博耶-摩尔(正如 Greg Hewgill 已经建议的那样),拉宾-卡普 and KMP算法。

如果您需要在同一大段文本中搜索许多小模式,您还可以尝试实现后缀树 or a 后缀数组。但恕我直言,这些有点难以理解和正确实施。

但要注意,这些技术非常快,但只有在涉及的字符串非常大时才会带来明显的加速。对于长度小于 1000 个字符的字符串,您可能看不到明显的加速。

EDIT:

如果您一遍又一遍地搜索相同的文本(即cs在调用之间总是/经常相同),通过使用后缀特里树(基本上是一个trie后缀)。由于您的文本只有 100 或 200 个字符,因此您可以使用更简单的 O(n^2) 方法来构建 trie,然后对其进行多次快速搜索。每次搜索只需要 5 次比较,而不是通常的 5*200 次。

Edit 2:

正如咖啡馆的评论所提到的,Cstrstr算法取决于实现。 glibc 使用线性时间算法,在实践中该算法应该或多或少与我提到的任何方法一样快。虽然OP的方法渐近较慢(O(N*m)而不是O(n)),但它更快可能是因为n和m(模式和文本的长度)都非常小并且它不必在 glibc 版本中进行任何长时间的预处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

strstr 的优化版本(搜索具有恒定长度) 的相关文章

  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • 如何使用最小起订量模拟私有只读 IList 属性

    我试图嘲笑这个列表 private readonly IList
  • 如何检查号码是否只有唯一的数字?

    例如 2345 是唯一的数字 因为没有数字显示两次 但 3324 不是唯一的数字 因为 3 出现了两次 我尝试使用 但我 代码 显示但我没有得到数字我得到了数字 编辑 你不能使用字符串 number 10 number 100 number
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • 在 Owl Carousel 2 中加载动态内容

    我有一个带有 2 个轮播的网页 我必须根据用户操作在其中显示不同的项目 新数据来自互联网 我使用fetch 将json解析成数组 一切都很好 唯一的问题是我无法让新项目替换旋转木马中的旧项目 举个简单的例子 我尝试过 var carouse
  • 写入具有设备名称的文件

    我遇到了一些奇怪的事情 我有一个反编译器 可以从二进制文件中提取信息 我正在提取一系列需要作为二进制文件单独写入磁盘的对象 这些对象是编译到库中的图形模型 这些对象中嵌入了名称 我需要使用该名称作为文件名 我在用 try Open file
  • 我可以在 cakephp 3 中的 Table 类上设置默认顺序吗

    在 CakePHP 2 x 中有一个属性 order在模型中 所以我使用这个属性来全局排序我的数据 例如 假设我需要在我的视图中显示一个包含国家 地区的选择框Country用于添加行的模型 order Country country DES
  • 在 tkinter 小部件中显示子进程的实时输出

    我的问题和这个几乎一样 显示子进程标准输出的小部件 但更进一步 我有以下代码 python2 7 def btnGoClick p1 params w line get if len params 0 return create child
  • net core 2.0 appsettings.json 保存在 bin 目录下

    我是新来的net core 2 0 我正在连接到数据库 我习惯使用App Config or Web Config设置连接字符串 但在net core 2 0中使用appsettings json文件代替 当我编译 de 应用程序时 app
  • Express.js req.body 未定义

    我将此作为我的 Express 服务器的配置 app use app router app use express cookieParser app use express session secret keyboard cat app s
  • 从列表中删除子列表

    我有 2 个清单 list1 and list2 都是int类型 现在我想删除内容list2 from list1 我怎样才能在 C 中做到这一点 PS 不要使用循环 重要变化 正如评论中指出的那样 Except 内部使用集合 因此任何重复
  • 使用 QListWidgetItem::setData 存储指针

    我有一个QListWidget日历 每个QListWidgetItem在逻辑上与一个实例相关联Calendar 它是属于应用程序模型端的类 我可以使用指针的形式存储这个关联吗QListWidgetItem setData 当我尝试执行此操作
  • 如何在 Azure Web 角色上禁用 RC4 密码

    我有一个托管在 Microsoft Azure Web 角色上的 Web 应用程序 如何禁用 RC4 密码 我使用 Powershell 脚本遇到的问题是需要修改的键包含正斜杠 而 Powershell 将此视为路径分隔符 因此脚本失败 解
  • 日期比较逻辑/液体模板过滤器

    我正在尝试创建一个类似 预购 的机制 其中我的 Shopify Liquid 模板的某些元素仅在当前日期大于或小于元字段中指定的日期时显示 截至目前 这就是我所拥有的 包括逻辑 p Today now date d m Y p p Rele
  • Flex:弄清楚正在运行的 swf 是何时编译的?

    无论如何 在 Flex 应用程序中是否可以 在运行时 确定运行的 swf 何时被编译 我想将其与服务器上 swf 的最新文件版本进行比较 并检测服务器上是否有更新版本 如果有 则强制用户重新加载浏览器以获取新版本 我需要它也可以与缓存中的
  • 节点-gyp。 MSBuild.exe`失败,退出代码:1

    我试图安装 Sharp 模块 这需要 c 编译器 我下载了 Visual Studio 2017 和 Visual C 构建工具 node gyp 安装成功 但是运行 npm install g Sharp 我遇到了很多错误 吉普 错误 堆
  • 如何在 ASP.NET ListBox 中设置多项选择?

    我无法在后面的代码中找到在 ASP NET ListBox 中选择多个项目的方法 这是需要在 Javascript 中完成的事情吗 您必须使用 ListBox 的 FindByValue 方法 foreach string selected
  • Python:如何修改/编辑打印到屏幕的字符串并将其读回?

    我想在 Windows 中将字符串打印到命令行 终端 然后编辑 更改该字符串并将其读回 有人知道该怎么做吗 谢谢 print Hell Hello lt Edit it on the screen s raw input print s H
  • 在IE11中,如何使用console.log?

    尝试使用console log 但总是打印undefined 尝试使用类似的解决方案Console log IE9 问题它也不起作用 In this IE11文档 有如下句子 Last but not least forget about
  • 比较数组是否相等,忽略元素的顺序

    我有一个包含 4 个数组列的表 结果如下 ids signed ids new ids new ids signed 1 2 3 2 1 3 4 5 6 6 5 4 无论如何都要比较ids and signed ids通过忽略元素的顺序 使
  • 重新附加实体图并检测集合更改

    我首先使用实体 框架代码 并通过 WCF REST HTTP 接口公开 Northwind 数据库 我没有公开 OrderDetails 表 订单项 因为创建订单然后通过另一个服务单独添加每个所需的 OrderDetail 是没有意义的 在
  • 在 Rails 中使用带有 has_many 的委托?

    我们有 2 个模型和一个连接模型 app models message rb Class Message lt ActiveRecord Base has many image messages has many images throug
  • 如何对实体的自定义属性进行建模?

    假设我们有一个应用程序应该能够存储所有类型的产品 每个产品至少有一个ID and a Name但所有其他属性都可以由用户自己定义 例如 他可以创建一个产品组Ipods其中将包含属性capacity and 一代 例如 他可以创建一个产品组T
  • strstr 的优化版本(搜索具有恒定长度)

    我的 C 程序有很多 strstr 函数调用 标准库 strstr 已经很快 但在我的例子中 搜索字符串的长度始终为 5 个字符 我用一个特殊版本替换了它以获得一些速度 int strstr5 const char cs const cha