千万个字符串的二叉排序树(字母顺序),可以精确查找,或者模糊查找,如找 abc*

jmcooler 2014-05-05 12:19:49
不限于二叉树,采用别的数据结构和算法也行
精确查找好办,可模糊查找,有什么好的建议啊
...全文
469 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
DeDeWo 2014-05-09
  • 打赏
  • 举报
回复
这个问题很有实际价值, everything中用到过(不开源),要是单纯的使用正则表达式去做暴力匹配会非常慢
taodm 2014-05-09
  • 打赏
  • 举报
回复
用数据库吧。别自己折腾。
showjim 2014-05-09
  • 打赏
  • 举报
回复
当然你可以适当的HASH前N(比如3)个字符(如果集合稳定可以尝试构造唯一HASH),然后再hash节点下再排序或者平衡树。
showjim 2014-05-09
  • 打赏
  • 举报
回复
前缀查找。 集合稳定的情况,排序+二分 已经是个不错的方法了。 集合不稳定,那就只能用平衡树了。 当然你可以适当的HASH前N(比如3)个字符(如果集合稳定可以尝试构造唯一HASH),然后再hash节点下载排序或者平衡数。
jmcooler 2014-05-08
  • 打赏
  • 举报
回复
我只有一个非常笨的方法,对于数据量特别大的时候,就太勉强了: 先将他们排序到一个字符串数组中,然后利用折半查找,先找到 abc,而 abc 前后紧邻的都符合 abc* 通配符 还好,我只需要进行 abc* 后缀式的统配查找。如果还要进行 *abc* 查找,那就难啦 因此,什么 trie,字典树,B 系列树,好像都行不通。还要建大量的索引,非常繁琐和庞大。 因为只需要进行 abc* 查找,我相信,有简便的办法
jmcooler 2014-05-08
  • 打赏
  • 举报
回复
如果这些字符串不重复,并且只进行精确查找,那么把这些字符串 hash 一下,用哈希表实现精确查找,或者将他们放入红黑树、平衡二叉树,都可以实现不重复的精确查找。 然而,就是数据重复,且要模糊查找,就不知道怎么搞了 呵呵,看看有算法高人没
jmcooler 2014-05-08
  • 打赏
  • 举报
回复
你们没理解我的问题所表述的意思,原因之一,恐怕是我写简单了,另外就是你们不太给力去理解。问题是这样的: 假定有如下的一系列字符串,这些字符串有重复,且排序很乱 wsta abcd abc tbwo abcd 我要模糊查找所有 abc*,就上面来说,就要把 abc, abcd, abcd 找出来,有什么高级数据结构和算法呢? 你们回答的,都是在一段文字中进行模糊查找,显然与我的题目不符。
乐百川 2014-05-05
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
//摘自《代码之美》
// 字符     含义
// .        匹配任意的单个字符
// ^        匹配输入字符串的开头
// $        匹配输入字符串的结尾
// *        匹配前一个字符的零个或者多个出现
#include <stdio.h>
int matchhere(char *regexp, char *text);

int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of text
   do {// a * matches zero or more instances
       if (matchhere(regexp, text)) return 1;
   } while (*text != '\0' && (*text++ == c || c == '.'));
   return 0;
}
int matchhere(char *regexp, char *text) {// matchhere: search for regexp at beginning of text
   if (regexp[0] == '\0') return 1;
   if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text);
   if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0';
   if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1);
   return 0;
}

int match(char *regexp, char *text) {// match: search for regexp anywhere in text
    if (regexp[0] == '^') return matchhere(regexp+1, text);
    do {// must look even if string is empty
        if (matchhere(regexp, text)) return 1;
    } while (*text++ != '\0');
    return 0;
}
void main() {
    printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));
    printf("%d==match(^a  ,abc)\n",match("^a"  ,"abc"));
    printf("%d==match(c$  ,abc)\n",match("c$"  ,"abc"));
    printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));
    printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));
    printf("-------------------\n");
    printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));
    printf("%d==match(^B  ,abc)\n",match("^B"  ,"abc"));
    printf("%d==match(A$  ,abc)\n",match("A$"  ,"abc"));
    printf("%d==match(a..c,abc)\n",match("a..c","abc"));
    printf("%d==match(a.*d,abc)\n",match("a.*d","abc"));
}
//1==match(abc ,abc)
//1==match(^a  ,abc)
//1==match(c$  ,abc)
//1==match(a.c ,abc)
//1==match(a.*c,abc)
//-------------------
//0==match(ABC ,abc)
//0==match(^B  ,abc)
//0==match(A$  ,abc)
//0==match(a..c,abc)
//0==match(a.*d,abc)
下次能不能多换几行啊,我看的好累……
赵4老师 2014-05-05
  • 打赏
  • 举报
回复
//摘自《代码之美》
// 字符     含义
// .        匹配任意的单个字符
// ^        匹配输入字符串的开头
// $        匹配输入字符串的结尾
// *        匹配前一个字符的零个或者多个出现
#include <stdio.h>
int matchhere(char *regexp, char *text);

int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of text
   do {// a * matches zero or more instances
       if (matchhere(regexp, text)) return 1;
   } while (*text != '\0' && (*text++ == c || c == '.'));
   return 0;
}
int matchhere(char *regexp, char *text) {// matchhere: search for regexp at beginning of text
   if (regexp[0] == '\0') return 1;
   if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text);
   if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0';
   if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1);
   return 0;
}

int match(char *regexp, char *text) {// match: search for regexp anywhere in text
    if (regexp[0] == '^') return matchhere(regexp+1, text);
    do {// must look even if string is empty
        if (matchhere(regexp, text)) return 1;
    } while (*text++ != '\0');
    return 0;
}
void main() {
    printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));
    printf("%d==match(^a  ,abc)\n",match("^a"  ,"abc"));
    printf("%d==match(c$  ,abc)\n",match("c$"  ,"abc"));
    printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));
    printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));
    printf("-------------------\n");
    printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));
    printf("%d==match(^B  ,abc)\n",match("^B"  ,"abc"));
    printf("%d==match(A$  ,abc)\n",match("A$"  ,"abc"));
    printf("%d==match(a..c,abc)\n",match("a..c","abc"));
    printf("%d==match(a.*d,abc)\n",match("a.*d","abc"));
}
//1==match(abc ,abc)
//1==match(^a  ,abc)
//1==match(c$  ,abc)
//1==match(a.c ,abc)
//1==match(a.*c,abc)
//-------------------
//0==match(ABC ,abc)
//0==match(^B  ,abc)
//0==match(A$  ,abc)
//0==match(a..c,abc)
//0==match(a.*d,abc)
sduxiaoxiang 2014-05-05
  • 打赏
  • 举报
回复
trie可以么
赵4老师 2014-05-05
  • 打赏
  • 举报
回复
这种代码换行再多也无助于理解其原理。

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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