高效的字符串查找函数

z1z2z3z4 2009-04-10 06:56:40
char *base = "...";//被查找字符串,长度1-10K

char *str[50] = {"aac", "p12", ...};//共有50个待查找字符串

bool find1()
{
for (int i = 0; i < 50; i++)
{
if (strstr(base, str[i])) return true;
}
}

bool find2()
{
for (int i = 0; i < 50; i++)
{
if (comp(base, str[i])) return true;//comp是自写的查找函数
}
}

find2的效率比find1高一些。但无论find1还是find2,每次要执行50轮的查找,效率远远不能满足要求。

不得已,向各位寻求一些算法思路。

主要任务就是,在一个长度大约几K到几十K的字符串中(注意这个字串是动态输入的),查找匹配大约50个字串(这些字串是静态的)。目前想到的利用第三方的正则库,或者用前缀数组或后缀数组之类实现。大家谈谈经验吧。
...全文
210 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gao125210 2009-04-10
  • 打赏
  • 举报
回复
kmp
yangch_nhcmo 2009-04-10
  • 打赏
  • 举报
回复
字符串匹配,KMP算法最有效率吧
  • 打赏
  • 举报
回复
一般的模式匹配改进算法就是kmp。

网上大把,自己搜点代码吧
taodm 2009-04-10
  • 打赏
  • 举报
回复
至少,你也该试一下for((int i = 0; i < strlen(base); i++) )这样循环吧。
tanlee007 2009-04-10
  • 打赏
  • 举报
回复
字符串匹配用KMP算法试试看,可不可以减少比较次数。
z1z2z3z4 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]
至少,你也该试一下for((int i = 0; i < strlen(base); i++) )这样循环吧。
[/Quote]
起初觉得这个循环的平均比较次数是一样的,都是strlen(base) * str个数 * 平均strlen(str) / 2

不过突然想到既然str[50]是静态的,其实可以把它构建为二叉字符树,然后用for((int i = 0; i < strlen(base); i++) )循环查找树,利用二叉树特性大幅度减少比较次数。

这个思路不错,回头测试一下,现在看下KMP先。
jaycnvip 2009-04-10
  • 打赏
  • 举报
回复
建议借助STL中的算法,先排序再查找。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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