社区
脚本语言
帖子详情
请对字符串处理比较有研究的高手进来看一下。
fzn0621
2003-01-23 12:42:29
我想知道LEFT、RIGHT、MID、replace等等这些字符串处理涵数的具体实现是什么?
因为我发现比如字符串搜索涵数:instr,搜索字符串很快,但如果我用MID(用循环遍历)来搜索一个字符串的速度是很慢的。
是否有人知道这些字符串处理涵数的内部实现呢?
...全文
82
5
打赏
收藏
请对字符串处理比较有研究的高手进来看一下。
我想知道LEFT、RIGHT、MID、replace等等这些字符串处理涵数的具体实现是什么? 因为我发现比如字符串搜索涵数:instr,搜索字符串很快,但如果我用MID(用循环遍历)来搜索一个字符串的速度是很慢的。 是否有人知道这些字符串处理涵数的内部实现呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zzzl
2003-01-27
打赏
举报
回复
现在最牛B的好象是dotnet的实现吧。
laughcry2002
2003-01-23
打赏
举报
回复
发信人: Sinbad <MicroBin@263.net>
标 题: Boyer-Moore-Hospool匹配算法
发信站: 辛巴达 (Mon Mar 4 14:31:04 2002)
发信人: frogprince (frog), 信区: programming
(snort所用的)
这个算法在大文件中搜索小pattern有很高效率。
推荐用来代替strstr();
这个实现我没有测过,不过应该不会有大问题。
C++的代码,容易使用:)
-------------------------------------------------
#include <string.h>
#include <assert.h>
#include <stdio.h>
class Search {
static const int MAXCHAR = 256;
int d[MAXCHAR];
int m;
char* patt;
public:
Search(char*);
int find(char*);
};
Search::Search(char* p)
{
assert(p);
patt = p;
m = strlen(patt);
int k = 0;
for (k = 0; k < MAXCHAR; k++)
d[k] = m;
for (k = 0; k < m - 1; k++)
d[patt[k]] = m - k - 1;
}
int Search::find(char* text)
{
assert(text);
int n = strlen(text);
if (m > n)
return -1;
int k = m - 1;
while (k < n) {
int j = m - 1;
int i = k;
while (j >= 0 && text[i] == patt[j]) {
j--;
i--;
}
if (j == -1)
return i + 1;
k += d[text[k]];
}
return -1;
}
#ifdef DRIVER
int main(int argc, char* argv[])
{
assert(argc == 3);
const int MAXLINE = 256;
char fbuf[MAXLINE];
Search patt(argv[1]);
FILE* fp = fopen(argv[2], "r");
assert(fp);
int nf = 0;
while (fgets(fbuf, MAXLINE, fp) != NULL) {
if (patt.find(fbuf) != -1) {
fputs(fbuf, stdout);
nf++;
}
}
fclose(fp);
return !nf;
}
--
※ 来源: http://sinbad.dhs.org
laughcry2002
2003-01-23
打赏
举报
回复
字符串搜索算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。另外,还有很多改进的BM算法存在,比如Boyer-Moore-Horspool算法。
KMP(Knuth-Morris-Pratt)算法
源码: http://personal.dfm-xf.com.cn/season/cpp/kmp.cpp
KMP算法是一种快速的模式匹配算法,可以充分利用模式字符串的特点,可以做到正文字符串比较时不回溯。
先是求模式字符串每个字符的失败链接值(从模式字符串开始到第n个字符跟以当前字符为结尾的前n个字符都相同的话,当前字符的失败连接值就是n),这一步与正文字符串无关。然后进行与正文匹配的时候一旦遇到不相同的字符,就可以省掉当前字符的失败链接值这么多个字符的比较,直接从第n+1个字符开始与正文字符串比较。
求失败链接值:
void fail(char* p,int next[])
{int j,k;
next[0]=-1;j=1;
do
{k=next[j-1];
while(k!=-1&&p[k]!=p[j-1])
k=next[k];
next[j++]=k+1;
}while(p[j]!='\0');
}
然后KMP算法:
int kmp(char* t,char* p,int next[])
{int k,jl
if(*t=='\0') return 0;
for(k=j=0;t[k]!='\0';)
{while(j!=-1&&p[j]!=t[k])
j=next[j];
k++;j++;
if(p[j]=='\0')
return k-j;
}
return -1;
}
两步的思想其实一样的,一个是自己跟自己匹配,一个是跟正文匹配而已
具体也很难说明白,还是找本书看看就知道了,很简单的
maddogdog
2003-01-23
打赏
举报
回复
有蛮多字符串匹配算法的。
循环遍历算法基本上未做任何优化。
fzn0621
2003-01-23
打赏
举报
回复
可以给我一些这方面的算法吗?
谢谢你了!
asp.net知识库
.NET 2.0中的
字符串
比较
小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1...
VB如何只读取
字符串
中的数字部分??
逐个字符判断,是否为 "+-0123456789." 中的一个,取出连续的数值部分问题不明确啊 比如: dim s as string dim v as long s="123abc456efg" 如果你只要123,那么有现成的函数: v=...
【SQL】CLR聚合函数什么鬼
之前写过一个合并
字符串
的CLR聚合函数,基本是照抄MS的示例,外加了一些
处理
,已经投入使用很长时间,没什么问题也就没怎么
研究
,近日想改造
一下
,遇到一些问题,遂捣鼓一番,有些心得,记录如下。 一、杂项 ...
python与php8-详解Python中Unicode和utf-8
在Python语言中,Uincode
字符串
处理
一直是一个容易让人迷惑的问题。...下面跟着小编一起来看下吧在Python语言中,Uincode
字符串
处理
一直是一个容易让人迷惑的问题。许多Python爱好者经常因为搞不清Unicode、UTF...
最新Java面试题整理!java字符大写转小写
没有靠谱的公司也就没有经验,我看了无数的书,自己做了无数的实验拼命想找个靠谱公司去深入,但是感觉好难,简直是个死循环 读者群的朋友大家都
比较
关注高并发,原因很简单,想去BAT这样的大公司,你必须要有高并发...
脚本语言
37,719
社区成员
34,238
社区内容
发帖
与我相关
我的任务
脚本语言
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
复制链接
扫一扫
分享
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
试试用AI创作助手写篇文章吧
+ 用AI写文章