社区
脚本语言
帖子详情
请对字符串处理比较有研究的高手进来看一下。
fzn0621
2003-01-23 12:42:29
我想知道LEFT、RIGHT、MID、replace等等这些字符串处理涵数的具体实现是什么?
因为我发现比如字符串搜索涵数:instr,搜索字符串很快,但如果我用MID(用循环遍历)来搜索一个字符串的速度是很慢的。
是否有人知道这些字符串处理涵数的内部实现呢?
...全文
96
5
打赏
收藏
请对字符串处理比较有研究的高手进来看一下。
我想知道LEFT、RIGHT、MID、replace等等这些字符串处理涵数的具体实现是什么? 因为我发现比如字符串搜索涵数:instr,搜索字符串很快,但如果我用MID(用循环遍历)来搜索一个字符串的速度是很慢的。 是否有人知道这些字符串处理涵数的内部实现呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
可以给我一些这方面的算法吗?
谢谢你了!
VB如何只读取
字符串
中的数字部分??
逐个字符判断,是否为 "+-0123456789." 中的一个,取出连续的数值部分问题不明确啊 比如: dim s as string dim v as long s="123abc456efg" 如果你只要123,那么有现成的函数: v=val(s) 如果你要123456,如老鸟所言,逐个字符判断,或者用正则 遍历~Private Sub Command1_C...
python与php8-详解Python中Unicode和utf-8
在Python语言中,Uincode
字符串
处理
一直是一个容易让人迷惑的问题。许多Python爱好者经常因为搞不清Unicode、UTF-8还有其它许许多多的编码之间的区别而大伤脑筋。本文将介绍Unicode和Python的中文
处理
的相关知识。下面跟着小编一起来看下吧在Python语言中,Uincode
字符串
处理
一直是一个容易让人迷惑的问题。许多Python爱好者经常因为搞不清Unicode、UTF...
MAXScript学习笔记(1)
入门教程 一、
字符串
操作 1.分解
字符串
为数组 filterstring 2.根据内容替换
字符串
substitutestring,不是replace,replace是替换具体的位置上的
字符串
,这种的不是我需要的。 3.删除
字符串
中的空格,没有找到trim()这样的操作, 找到一个代码: fn RemoveAllWhiteSpace inputString = ( local ou...
Spring - SpringMVC(二)
使用示例 3.2
请
求转发并传递数据【重点】 是SpringMVC提供的组件之一,其中 ,模型,用于封装数据(Springmvc会把数据放到了request域中) ,视图,就是页面,用于展示数据 如果我们设置了视图名称,并且封装了数据模型,SpringMVC会: 把Model的数据放到request域对象中,然后
请
求转发到指定的视图(页面) 我们可以视图页面中获取数据显示出来 **使用示例 ** 在index.jsp视图页面中,取出数据显示出来 4.小结 返回页面文件名方法返回
最新Java面试题整理!java字符大写转小写
前言 近年来,微服务架构(Microservices Architecture)已经成为一种主流的软件开发方法论,所谓微服务( Microservices ),就是一些具有足够小的粒度、能够相互协作且自治的服务体系。 微服务架构基于分布式系统,同时借助了面向服务架构和企业服务总线的设计理念并做了改进和优化,从而形成一种新的架构体系。 微服务架构一方面具备技术、业务和组织上的优势,另一方面也在技术架构和研发过程中存在巨大挑战。像阿里、腾讯、滴滴这类大厂微服务架构是必备的技能,都在不断摸索跟学习的路上!我之所以
脚本语言
37,743
社区成员
34,212
社区内容
发帖
与我相关
我的任务
脚本语言
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写文章