快速查找模糊匹配串

chenzhichao2008 2006-04-17 10:30:17
对两个字符串进行模糊匹配,将得到一个匹配值
比如: abcde与abceb由于有子串abce相同,得到一个较大的匹配值:92%
这个匹配过程平均用时O( ((m+1)*n)/2 )

现在有一个关键字列表,我要在这个表中找一个与指定字符串匹配值最大的关键字,但这个表比较大,因此想问如何调整这个表结构,使得查找速度最快,请给我一点建议就可以了,谢谢

关键字列表
$1
ADDR
ADDRESS
ADICIONAR
ADRESSAGE
ADRESSE
ALOJAMIENTO
ANSCHRIFT
ARRONDISSEMENT
BANLIEUE
.....
$2
.....

...全文
2237 25 打赏 收藏 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhichao2008 2006-05-25
  • 打赏
  • 举报
回复
好的,元创,这里分给你少些,那边给你多些
yuanchuang 2006-04-20
  • 打赏
  • 举报
回复
chenzhichao2008(陈智超) ( ) 信誉:95 2006-04-20 08:36:00 得分: 0


aacb <-> aacc较高





方法,我现在已经想到了,谢谢你们的参与,今天有空就结帖
---------------------
别忘了你说,多给点C++板块的分给我啊!
yuanchuang 2006-04-20
  • 打赏
  • 举报
回复
chenzhichao2008(陈智超) ( ) 信誉:95 2006-04-20 08:36:00 得分: 0


aacb <-> aacc较高





方法,我现在已经想到了,谢谢你们的参与,今天有空就结帖
---------------------
别忘了你说,多给点C++板块的分给我啊!
ywchen2000 2006-04-20
  • 打赏
  • 举报
回复
能把方法写出来吗???
chenzhichao2008 2006-04-20
  • 打赏
  • 举报
回复
aacb <-> aacc较高





方法,我现在已经想到了,谢谢你们的参与,今天有空就结帖
kirc 2006-04-19
  • 打赏
  • 举报
回复
BTW:如果你的数据是等长的话,我觉得可以用hash.
kirc 2006-04-19
  • 打赏
  • 举报
回复
我觉得这与你的匹配值算法有很大关系.

你的匹配值算法是什么??

aacb <-> cacb
aacb <-> aacc
哪个匹配值更高?
jseeker 2006-04-19
  • 打赏
  • 举报
回复
问题中似乎限制了匹配算法,在这种情况下除了遍历实在不知道还有什么办法
chenzhichao2008 2006-04-19
  • 打赏
  • 举报
回复
天黑了,星星快点出来啊
xzhunter 2006-04-19
  • 打赏
  • 举报
回复
TO:chenzhichao2008(陈智超)

有意思。。。

不过用hash完全定位不大可能

1,正如你说的,可能有不完全匹配的,这样就不好弄了,如何hash算法不是线性的,你是没法知道范围的

2,使用hash最大的缺点还不是1,而是内存消耗,内存消耗,比其他结构多好几倍。

=================
不过可以先用部分的hash匹配,然后再结合传统的字符匹配算法。
chenzhichao2008 2006-04-18
  • 打赏
  • 举报
回复
说明一个,表中不一定有完全匹配(100%)的关键字
只是要求匹配最大的关键字
用hash表,
abbe abcd aced bcde cacb
| | | | |
-------------------------
查找与 aacb最匹配的关键字时
要怎么样设置这个hash函数
使它定位到cacb,且aacb也不一定都是aacb
有可能是kacb,accb, aabc,等

我曾想过用hash函数使得查找范围变小,
但是一个原字串abcdefghij,可能被识别为abkdbfghvj,等
这个hash值范围可能很大,那样就达不到缩小查找范围的目的了

chenzhichao2008 2006-04-18
  • 打赏
  • 举报
回复
按字典顺序排序吗?
目前关键字较多,一个一个查找,速度会很慢的,如果是精确匹配,可以先按字典顺序排序后再二分查找,但对于模糊匹配,如果按字典顺序排序后二分查找,显然是不行的例:
在
abbe
abcd
aced
bcde
cacb
中查找与 aacb最匹配的关键字,当查找到abed时,由于 aacb < abed ,所以要往上找,但这样将错失了cacb这个最优解因此.这样就不能用字典顺序来确定两个串的大小了,要怎么样去定义两个串的大小关系,或者试用别的方法,使得查找范围较小

chenzhichao2008 2006-04-17
  • 打赏
  • 举报
回复
如果可以定义两个串的大小,如何定义?
jp1984 2006-04-17
  • 打赏
  • 举报
回复
你倒挺悠闲的!

这个用hash很方便了, 对关键字做个字典序 .
然后按首字binary search,依次进行.

复杂度很低.O(n+n*lgn)
chenzhichao2008 2006-04-17
  • 打赏
  • 举报
回复
下班了,回家看电影去,明天睁天眼的时候希望就能看到答案,大家如果饿了,就先回去吃个饭,洗个澡吧,等会儿会有很多高手出场了,大家免费观看.......
yuanchuang 2006-04-17
  • 打赏
  • 举报
回复
chenzhichao2008(陈智超) ( ) 信誉:95 2006-04-17 18:36:00 得分: 0


是的,再没人来,分就都是你的了,哈哈
------------------------
最主要的我是要C/C++板块的分,这个帖子里的分我无所谓。

你把那个帖子加满,多给点我就行了,嘿嘿
chenzhichao2008 2006-04-17
  • 打赏
  • 举报
回复
为什么都误会我的意思了
chenzhichao2008 2006-04-17
  • 打赏
  • 举报
回复
我不是要知道如何查找子串
chenzhichao2008 2006-04-17
  • 打赏
  • 举报
回复
呵呵,小叶,看来你都是潜水啊
匹配值,主要是跟据公共子串和长度确定的,连续性也有考滤
我想要在表中快速查找匹配值最大的关键字,不是要怎样模糊匹配啊


chenhu_doc 2006-04-17
  • 打赏
  • 举报
回复
#include "stdio.h"

int next[255];
char pat[]="babcabc";
char str[]="fsoifhewgsdksdkfhsdifhewhfefksdhfdsoihfoehfosdhfdsaacaab";


void getnext(seqstring p,int next[])
{
int i,j;
next[0]=-1;
i=0;
j=-1;
while(i<p.length)
{
if(j==-1||p.str[i]==p.str[j])
{++i;++j;next[i]=j;}
else
j=next[j];
}
for(i=0;i<p.length;i++)
printf("%d",next[i]);
}


void getNext(char pat[], int next[])
{
int i = 0;
int j = 0;
while( pat[i] )
{
if( i == 0)
pat[i] = 0;
else
{
j = 0;
k = i;
while( pat[j] == pat[k])
}
}

int KMP(char *str1, char*pat, int *next)
{
int i=0,j=0;
while(str[i])
{
if(pat[j]==0)
return i-j;
if(j==0 || str[i]==pat[j])
{
++i;
++j;
}else
j=next[j];
}
if(pat[j]==0)
return i-j;
return -1;
}

int main(int argc, char* argv[])
{
int i;
int result;
getNext(pat,next);
result=KMP(str,pat,next);
printf("%s\n",str);
for(i=0;i<result;i++) printf(" ");
printf("%s\n",pat);
printf("at %d\n",result);
return 0;
}
//前几天刚刚贴出去的
加载更多回复(5)

33,026

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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