免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1581 | 回复: 9
打印 上一主题 下一主题

[C] 请问除了线性查找之外有什么更好的查找方法吗 谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-13 18:50 |只看该作者 |倒序浏览
本帖最后由 wrewwfw 于 2013-12-13 21:42 编辑

请问各位一个问题呢 就是在一个c的无序数组
类似char **x 这个动态数组里面 每个元素里面存储的是一个字符串
然后有一篇文章字符串y  因为这个char **x比较大  
我怎么高效率(除去线性查找)的查出这个动态数组x里面的哪一个元素包含在了这个文章字符串y中呢?(类似strstr(y,x)!=NULL) 谢谢
(本人对c不了解 门外汉 谢谢了




请问各位 可能我说错了不好意思  其实我想说的不是strstr的效率 而是x数组太大的问题 要一个一个的去和y比较  所以线性很慢
假设我这里想要比较x==y  因为我的x是预先建立的 固定的 而y的内容不固定

我想按照x的长度来分块 分成几个不同的数组 这样 我每次只要求y的长度了 就去对应的分块x里面去线性循环比较

我想的是另外申请个整数数组来按照长度存储
举个例子

inx len[][]
里面存储的规则是  len[y的长度]={x里面符合y的长度的所有下标集合}

但是y的长度不固定 就是不连续  请问这个Int数组应该怎么申请呢 谢谢 不太懂c  不好意思

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
2 [报告]
发表于 2013-12-13 19:24 |只看该作者
1、一般不会在文章中找随机字符序列,真正查找的单位是“单词(外语)”或字(汉语)

2、常用单词/字的数量有限;所以可以给它们一个编码

3、待查找的特定单词/字的组合也有限;设计一个映射,将单词/字的编码序列映射到第二个编码(如hash);建议用rolling hash算法
或者,直接把这个字符串存入hash_map<string, bool>也行。

4、扫描整篇文章,按单词为单位,计算rolling hash
或者,以“最长单词数”为依据,检查它们是否在hash表中——这里是直接利用hash表的hash函数,和存储没什么关系

论坛徽章:
0
3 [报告]
发表于 2013-12-13 19:25 |只看该作者
用map即可。。。

论坛徽章:
0
4 [报告]
发表于 2013-12-13 19:26 |只看该作者
string的匹配还是挺麻烦的,建议数值对应
komakoh 发表于 2013-12-13 19:25
用map即可。。。

论坛徽章:
0
5 [报告]
发表于 2013-12-13 19:27 |只看该作者
我看题目的时候看到过map这玩意,感觉挺好用,正在学数据结构,还不太动,问问hash map跟map是一回事么?跟hash table有什么关系
shan_ghost 发表于 2013-12-13 19:24
1、一般不会在文章中找随机字符序列,真正查找的单位是“单词(外语)”或字(汉语)

2、常用单词/字的数 ...

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
6 [报告]
发表于 2013-12-13 19:28 |只看该作者
这个方案,检查某个字符串是否在列表中,效率是O(1)的,这也是hash的特点。

检查次数,和最长/最短语句的单词数有关,大约等于 最长单词数-最短单词数 次;设这个值为K。

整个搜索扫描文件一次,所以效率是O(N)的;最终效率是O(KN),由于K不会很大,故最终效率还是O(N)。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
7 [报告]
发表于 2013-12-13 19:31 |只看该作者
komakoh 发表于 2013-12-13 19:27
我看题目的时候看到过map这玩意,感觉挺好用,正在学数据结构,还不太动,问问hash map跟map是一回事么?跟 ...


hash_map就是hash表。

map是红黑树。


hash_map不是标准容器;如果你的编译器支持c++11,可以用unsorted_map——估计是因为hash_map已经被用过了,所以新标准绕开了这个名字,以免导致旧代码出现兼容性问题。

论坛徽章:
0
8 [报告]
发表于 2013-12-13 20:39 |只看该作者
请问各位 可能我说错了不好意思  其实我想说的不是strstr的效率 而是x数组太大的问题 要一个一个的去和y比较  所以线性很慢
假设我这里想要比较x[i]==y  因为我的x[i]是预先建立的 固定的 而y的内容不固定

我想按照x[i]的长度来分块 分成几个不同的数组 这样 我每次只要求y的长度了 就去对应的分块x里面去线性循环比较

我想的是另外申请个整数数组来按照长度存储
举个例子

inx len[][]
里面存储的规则是  len[y的长度]={x里面符合y的长度的所有下标集合}

但是y的长度不固定 就是不连续  请问这个Int数组应该怎么申请呢 谢谢 不太懂c  不好意思

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
9 [报告]
发表于 2013-12-14 13:27 |只看该作者
我没理解错,你没理解对而已

论坛徽章:
0
10 [报告]
发表于 2013-12-14 17:36 |只看该作者
shan_ghost 发表于 2013-12-14 13:27
我没理解错,你没理解对而已


你好 麻烦你看看呢
请问各位 可能我说错了不好意思  其实我想说的不是strstr的效率 而是x数组太大的问题 要一个一个的去和y比较  所以线性很慢
假设我这里想要比较x==y  因为我的x是预先建立的 固定的 而y的内容不固定

我想按照x的长度来分块 分成几个不同的数组 这样 我每次只要求y的长度了 就去对应的分块x里面去线性循环比较

我想的是另外申请个整数数组来按照长度存储
举个例子

inx len[][]
里面存储的规则是  len[y的长度]={x里面符合y的长度的所有下标集合}

但是y的长度不固定 就是不连续  请问这个Int数组应该怎么申请呢 谢谢 不太懂c  不好意思

c语言里面有相应的结构可以这样处理吗?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP