请对字符串处理比较有研究的高手进来看一下。

fzn0621 2003-01-23 12:42:29
我想知道LEFT、RIGHT、MID、replace等等这些字符串处理涵数的具体实现是什么?
因为我发现比如字符串搜索涵数:instr,搜索字符串很快,但如果我用MID(用循环遍历)来搜索一个字符串的速度是很慢的。
是否有人知道这些字符串处理涵数的内部实现呢?
...全文
82 5 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
可以给我一些这方面的算法吗?
谢谢你了!

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧