C++ 中短字符串的快速算法

C++快速幂算法 阅读详情
如果我们在实际工程中,碰到的字符串都是小于8个字节的短字符串,我们可以通过以下的方法优化来提升系统的性能

就是将字符串pack到一个64位整数里。

下面的算法将短字符串转换为一个整数

inline void convert(const string & buf, uint64 & n) 
{ 
     n 
= 0; 
     
int length = buf.length(); 
     
for(int i = 0; i < length; ++i) 
     
{ 
          n 
= (n << 8) + (uint64)(buf[i]); 
     }
 
}

我们在此基础上实现一个查找算法

class ShortString 
{ 
public: 
     ShortString(
const string & buf) 
     
{ 
          convert(buf,m_str); 
     }
 
 
     
bool find(const uint64 & nsub, const int num) 
     
{ 
          uint64 n; 
          uint64 mask 
= 0; 
          
for(int i = 0; i < num; ++i) 
          
{ 
               mask 
= (mask << 8) + 0xFF; 
          }
 
          
for(int i = 0; i < 8; ++i) 
          
{ 
               n 
= (m_str >> (8 * i)); 
               
if(n < nsub) break; 
               n 
= (n & mask); 
               
if(n == nsub) return true; 
          }
 
          
return false; 
     }
 
 
private: 
 
private: 
     uint64 m_str; 
}
;

测试函数如下

int main()
{ 
     
string buf = "abcdefgh";
     ShortString shortstr(buf);
     
string sub = "cddg"; 
     uint64 nsub; 
     convert(sub,nsub);
     time_t begin_time,end_time; 
 
     
if(shortstr.find(nsub,4)) cout << "ok" << endl;
 
     begin_time 
= clock (); 
     
for(int i = 0; i < 10000000; ++i)
     
{ 
          
if(shortstr.find(nsub,4)); 
     }
                                                                                                                                                  
     end_time 
= clock ();
     cout 
<< end_time - begin_time << endl;
 
     begin_time 
= clock ();
     
for(int i = 0; i < 10000000; ++i)
     
{ 
          
if(buf.find(sub));
     }

     end_time 
= clock ();
     cout 
<< end_time - begin_time << endl;
 
     
return 0; 
}
 


根据测试,这个方法比普通的快4倍左右
C++文件的读写和对多行多个字符串的处理 C++读写文件中的字符串 今天帮人做了个简单的作业,没想到花时间最多的不是算法而是文件的读写,还有对读入字符串的分割处理。晚上写作业的时候又用到了对字符串的处理,这里记录一下。 代码有查阅各种资料,但是成品为原创。 重点是文件的读和写 #include 文件的读:从内存(硬盘)读到缓冲区屏幕 ifstream in; in.open(fileName.data(), ios::in); /... 阅读详情

相关推荐

C++ 高性能模糊字符串匹配库 rapidfuzz-cpp 完整实战指南

本文介绍高性能C++模糊匹配库rapidfuzz-cpp,它是Python RapidFuzz的C++移植实现,采用MIT协议,纯头文件设计,支持跨平台。文章详述了三大核心优势:数十倍性能提升、完整算法体系、极低接入成本;提供了3种CMake集成方案;横向对比了ratio、partial_ratio等主流相似度算法的适用场景;并给出完整可运行示例代码,覆盖文本预处理、各类相似度计算和批量检索。该库特别适合电商搜索、数据清洗、OCR校正等需要处理文本差异的场景,是C++生态中高效的模糊匹配解决方案。

踏板鞋的专栏 505

c++(从键盘接收5个字符串,找出其中的最大和最小的字符串。)

从键盘接收5个字符串,找出其中的最大和最小的字符串。 #include<iostream> #include<string> using namespace std; int main() { string str[5],maxm,minm; for(int i=0;i<5;i++) cin>>str[i]; ...

Kerryliuyue的博客 4404

C/C++ Rabin Karp算法字符串快速查找算法详解及源码

Rabin Karp算法是一种字符串快速查找算法,用于在一个主串中查找一个模式串的出现位置。它利用了字符串的哈希值来进行匹配,因此在某些情况下比传统的字符串匹配算法更高效。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 7763

找最小的字符串(C/C++):

7-10 找最长的字符串(15分) 本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。 输入格式: 输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。 输出格式: 在一行中用以下格式输出最长的字符串:

xiaoxie_life_study 734

国标Gb28181里Contact和Route的使用

国标Gb28181是基于Sip协议的,因此对Contact和Route的使用,也可以说是Sip里Contact和Route的使用。Contact和Route则是sip协议里的头字段。 现在,在使用国标Gb28181来做项目时,经常会遇到这种情况,国标的下级是在内网里,上级在公网上。如果不做处理,下级到上级会经过nat协议的转换从而导致上级向下级发送请求时(比如获取目录请求)不能到达

wwyyxx26的专栏 5511

FPGA实战:手把手教你用Verilog实现Modbus CRC16校验(附完整代码)

本文详细介绍了在FPGA中实现Modbus RTU协议CRC16校验模块的完整实战方案。针对硬件设计中的时序、资源与性能挑战,文章从算法原理出发,提供了清晰的Verilog模块接口、状态机设计、查表ROM实现及优化策略,并附带了完整的可综合代码与测试平台,帮助工程师高效构建稳定可靠的工业通信系统。

weixin_29164185的博客 432

【C++语法】C++处理字符串的方式

第一种:用C语言字符数组的方式 1、字符数组的初始化: 方法一:和普通数组一样初始化 char dog[8] = {'b', 'e', 'a', 'u', 'x', '', 'I', 'I'}; //不是字符串 char cat[8] = {'f', 'a', 't', 'e', 's', 's', 'a', '\0'};//是字符串 注意:字符数组需要以空字符'\0'结尾 将字符数组初始化为字符串的工作看上去冗长乏味——使用大量的单引号,且必须加上空字符,这里有一种更好的、将字符数组初始化为字

qq_43601446的博客 1804

Apache Paimon快照管理实战:如何避免Flink作业中的反压问题?

本文深入探讨了如何通过优化Apache Paimon的快照管理机制来避免Flink作业中的反压问题。详细解析了同步与异步快照过期模式的适用场景及配置建议,并提供了Checkpoint策略与状态后端的协同优化方案,帮助提升实时数据处理的性能和稳定性。

i1j2k的博客 177

长度最小的子数组/C++

输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。

qq_43691090的博客 234

用nTopology五分钟生成三维Voronoi泡沫:节点式建模从原理到实操

多孔结构在增材制造与轻量化设计中应用广泛,其中Voronoi泡沫因其优异的缓冲吸能和比刚度表现备受关注。传统CAD建模需处理复杂布尔运算和网格修复,而隐式建模通过数学场描述几何体,将空间距离与密度分布转化为可视化节点,大幅降低操作门槛。nTopology基于场驱动与参数化逻辑,无需编写命令,即可实时调节胞元尺寸、壁厚及随机种子,快速生成可打印的泡沫实体。这种工作流适用于缓冲垫、医疗植入体、航空支架等场景,也为梯度密度结构与力学仿真验证提供了高效路径。本文围绕三维Voronoi泡沫的生成原理与节点操作流程,详

weixin_26767391的博客 151

PicoRV32 笔记 05

PicoRV32 本地总线接口

jjinl的专栏 1574

查找最小的子串

没事做了一个查找最小的子串的题目源代码如下: #include main(){  char *a="fdsf fdsfasf fasfafasf fdafa fafaa asdf afdfsfsdfsfsdfsdfsd";  char *ptr;  int max=0,num=0;  ptr=a;  while(*ptr!=/0)    {         if((*ptr)!=3

xiehuin的专栏 979

YOLO11实战 第056期-基于yolo11的无人机航拍铁路障碍物检测实战-数据集&源码&系统

召回率曲线帮助评估模型在目标检测任务中,检测到真正目标的能力。通过这条曲线,可以评估模型在目标检测任务中的整体性能,并找到合适的置信度阈值,以在精确率和召回率之间做出最佳平衡。PR曲线越接近右上角,模型性能越好,曲线下方的面积越大,说明模型在不同置信度下的。这条曲线显示了随着置信度的增加,每个类别的召回率先变化较小,然后在某个点之后迅速下降。通过这条曲线,可以选择合适的置信度阈值,以优化模型的检测结果,平衡精确率和召回率。曲线都显示了随着召回率的增加,精确度略有下降的趋势,但整体上精确度保持在很高的水平。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 157

RapidFuzz-CPP:高效字符串相似度计算的C++利器

RapidFuzz-CPP是一款高性能C++字符串相似度计算库,支持Levenshtein距离、Jaro-Winkler等多种算法,具有SIMD加速和缓存优化等特点。该库采用纯头文件设计,支持跨平台使用,在数据清洗、中文文本匹配等场景中表现优异。通过基准测试显示,其性能比标准实现提升7-9倍。最佳实践包括使用UTF-8编码、数据预处理和合理选择算法。该库简化了文本相似度计算,为开发者提供了高效的解决方案。

llhllq2015的博客 1245

VTK vtkLookupTable vtkScalarBarActor 颜色条

有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条1.以 Z 显示颜色 效果如下。

q610098308的专栏 4034

提示工程架构师揭秘:prompt优化中的“隐性成本”如何控制?

当我们谈论Prompt优化时,往往聚焦于“效果提升”——比如让模型生成更准确的回答、更符合要求的格式。优化的本质是“成本-收益”的平衡。那些看不见的“隐性成本”,比如反复调试的时间消耗、复杂Prompt带来的认知负荷、长文本导致的系统资源浪费、后续维护的无穷麻烦,往往会在长期运营中成为压垮效率的“稻草”。本文将从提示工程架构师的视角,揭秘Prompt优化中的“隐性成本”到底是什么、如何量化,以及通过哪些工程化手段将这些“看不见的消耗”转化为“可控制的效率”。

操作系统内核探秘的博客 700

Rapidfuzz-cpp:高性能的字符串匹配库

Rapidfuzz-cpp:高性能的字符串匹配库 在软件开发和数据处理中,字符串匹配是一个常见且重要的任务。Rapidfuzz-cpp 是一个高性能的字符串匹配库,使用 Levenshtein 距离算法来实现模糊字符串匹配。以下是对该项目的详细介绍。 项目介绍 Rapidfuzz-cpp 是一个为 C++ 和 Python 提供快速字符串匹配的库,基于 FuzzyWuzzy 的字符串相似度计算。R...

gitblog_01062的博客 804

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

cert-manager 全面支持 certificates.k8s.io CertificateSigningRequest:设计决策与落地实践

> 本篇技术指南以 cert-manager 仓库中的设计文档 [design/20210209.certificates.k8s.io-adoption.md](https://link.gitcode.com/i/72dbf3806b99a953ddb69a435935c031) 为核心骨架,结合仓库内 `pkg/controller/certificatesigningrequests/`

gitblog_00390的博客 996

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

xxhash_cpp: 高性能哈希算法库在C++中的实现

xxhash_cpp: 高性能哈希算法库在C++中的实现 项目介绍 xxhash_cpp 是一个基于 xxHash 算法的C++封装库,xxHash是一款极其快速的非加密哈希算法,它专为接近RAM速度运行而设计。该算法提供了多种变体,包括 XXH32、XXH64、XXH3_64bits 和 XXH3_128bits,适用于不同的数据处理场景。xxhash_cpp 库让C++开发者能够轻松地将这一高...

gitblog_00236的博客 781

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

一种快速的字符串匹配算法

/* 快速字符串查找函数:目前比较流行的字符串有KMP与BM算法,实际上KMP算法在使用的时候比strchr快不了多少,而BM算法也大约只有KMP算法的3~5倍。这里介绍一个快速字符串查找函数。举一个例子:"Hello, world"中查找"word"子串,可以先把两个字符串按照首字节对好:Hello, worldworld我们可以看出刚开始是不能匹配的,这样需要将子串往后移,至于每次

qinzx2004的专栏 2695

KMP算法详解及C++实现

目录一、介绍KMP算法解决的问题二、KMP算法的核心思想三、KMP的代码实现(C++) 一、介绍KMP算法解决的问题 KMP算法实际上解决的是一个字符串匹配的问题,即从一个目标字符串(通常非常长)中找到与给定字符串(也称为模式串)相匹配的字串的位置,例如: 目标串:ABB ABABCABAA CAADB ABABCABAADDABC 模式串:ABABCABAA 那么如果用人脑去找,很容易找出模式串在目标串出现的位置有第 二、KMP算法的核心思想 三、KMP的代码实现(C++) ...

yxy1301446882的博客 1万+

10min快速回顾C++语法(五)字符串专题

C++的语法基础(五)⭐写在前面的话:本系列文章旨在短时间内回顾C/C++语法中的重点与易错点,巩固算法竞赛与写题过程中常用的语法知识,精准地解决学过但有遗忘的情况,为算法刷题打下坚实的基础。字符与整数——ASCII码 8.2 字符数组 8.2.1 字符数组的输入输出: 8.2.2 字符数组的常用操作 8.2.3 遍历字符数组中的字符 8.3 标准库类型string 8.3.1 定义和初始化 8.3.2 string上的操作 8.3.3 处理string对象中的字符......

timerring的博客 1万+

Node-RED 数据处理实战手册:JSON、XML、CSV 的互转与排错

Node-RED 的数据处理,主要靠核心解析器里的一组节点完成:JSON、XML、CSV(还有 HTML、YAML),它们能把 msg 里的字符串、对象和表格数据互相转换。这篇文章不按"技巧清单"罗列,而是跟着一条数据在流程里走完全程:怎么从字符串变成对象,怎么在 XML 和 CSV 之间互转,字段对不上或坏消息出现时怎么办,最后再看怎么提速。 ## 数据入口:三步把 JSON 字符串解析成对象

gitblog_00964的博客 1058

【亲测免费】 UTF8-CPP库使用教程

UTF8-CPP是一款简洁高效的C++库,专门设计用于跨平台地处理UTF-8编码字符串。此库遵守C++98标准,为C++开发者提供了一个简单而又易于移植的方法来处理Unicode编码字符串。对于已经熟悉STL算法和迭代器的开发者而言,它能够无缝集成现有工作流程。 ### 主要特性: - **跨平台性**:可在各种操作系统和编译器环境下运行。 - **轻量化**:无额外依赖项,易于集成至已有项目...

gitblog_00496的博客 1388

Playwright Test TestProject 配置详解:多项目编排、依赖链与并行控制的完整指南

本文基于 Playwright 仓库的 API 文档 `docs/src/test-api/class-testproject.md` 展开,系统讲解 `TestProject` 的全部配置项及其解析优先级,并结合 `packages/playwright/src/common/config.ts` 等源码实现,说明多浏览器/多设备项目如何声明、`dependencies`/`teardown`

gitblog_01174的博客 835

c++ 使用分而治之算法进行快速乘法的 Karatsuba 算法(唐叶算法)

唐叶算法 看一下上面的公式,有四次大小为n/2的乘法,所以我们基本上将大小为n的问题分为四个大小为n/2的子问题。但这并没有帮助,因为递归 T(n) = 4T(n/2) + O(n) 的解是 O(n^2)。在经典方法中,时间复杂度为O(n^2),因为循环迭代了 n 次。在Karatsuba 方法中,辅助空间为O(n),因为Karatsuba 类的“乘法”方法是针对三个乘积中的每一个递归调用的。通过上述技巧,递推式变为 T(n) = 3T(n/2) + O(n) 并且该递推式的解为 O(n 1.59 )。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1171
上一篇: javascript:如何获得鼠标在屏幕上的位置
下一篇: C++初学者应该关心的优秀图书一览
xlvector
博客等级 码龄21年 64粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值