对象obj(假设是List<string>或Dictionary,可自行选择)内有记录数10W(持续增长),
现需求为:
当输入类似"欢迎来到csdn"之类的字符串时,搜索obj,如果包含有"欢迎来到csdn"任一词则返回true.
此操作为多线程.
其中"欢迎来到csdn"已分词,如: string[] str={"欢迎","来到","csdn"};
//当然,可以直接迭代obj,不过这样子下来性能方面跟不上.不知各位有没有更好的搜索方法呢?
当然,输入的字符你可以自行处理,分不分词自行决定.PS:另求一个高性能的分词类,呵呵,谢谢~~~
现需求为:
当输入类似"欢迎来到csdn"之类的字符串时,搜索obj,如果包含有"欢迎来到csdn"任一词则返回true.
此操作为多线程.
其中"欢迎来到csdn"已分词,如: string[] str={"欢迎","来到","csdn"};
//当然,可以直接迭代obj,不过这样子下来性能方面跟不上.不知各位有没有更好的搜索方法呢?
当然,输入的字符你可以自行处理,分不分词自行决定.PS:另求一个高性能的分词类,呵呵,谢谢~~~
解决方案 »
- asp.net3.5是不是就默认支持ajax,不用再安装ASPAJAXExtSetup.msi文件?
- 关于使用Jillzhang.GifUtility
- 关于主从表的问题(求帮助)
- 大家推荐本 数据结构 的图书
- JS与火狐的兼容问题
- 如何在一个虚拟目录中取得另外一个虚拟目录中的文件物理地址
- 这种XML写法有没有问题,请高手指正.如正确该如何生成呢?
- ******* pacpdate='"+Request["pacpdate"]+"',我让数据库里pacpdate字段也变成了CHAR型的,可为什么保存的老是2005-7-7呢?
- 如何控制DataGrid表格线的显示?
- mvc中提交表单如何同时上传图片
- 关于浏览器显示 url问题????
- 我写个博客,有关发表文章的时候一些问题
那么大数据量,用引用类型比较恐怖(开辟-定义-存储)浪费资源。
实际数据--和指针地址那个快。栈的内存分配是自动释放(值);而堆在.NET中会有GC来释放(引用)
————————————————————————————
sorry ! i will have lunch. after a while go on !
然后Key中存放string[] str={"欢迎","来到","csdn"}。
重写Key的GetHashCode().只要string中匹配则返回同样
的hashCode。这样就能找到对象。Equal可以随便重写。
return base.Equal就行。
ps: 个人猜想,利用Hashtable寻址比较迅速。具体可行性
还得验证,不过List的速度和Hashtable数量多了之后,速度
不是一个级别上的...
至于多线程,这种每个线程任务都是饱和的情况下分线程是没有
用的。多线程适用于有个线程等待、有的处理的情况。
declare @t2 table (n varchar(50))
insert into @t1 values('abcdefghijkl')
insert into @t2 values('abc')
insert into @t2 values('def')
insert into @t2 values('ghi')
insert into @t2 values('rewrwe')
select * from @t2 a join @t1 b on b.n like '%' + a.n + '%'直接用数据库解决掉算了
declare @t2 table (n varchar(50))
insert into @t1 values('我中国人发财')
insert into @t2 values('人无')
insert into @t2 values('黄中')
insert into @t2 values('发财迷')
insert into @t2 values('有朵花')
select * from @t2 a join @t1 b on b.n like '%' + a.n + '%'单个词/字如何解析.sql俺很是门外,见笑. --|
2. 用二叉树:
发
|
工 - 明 - 现 - 财
|
资
大至原理是先预处理被搜索的10W条数据,进行分词,用这些词建立一个哈希表,关键字是分出来的这些词,值是对应的行ID的集合。查找时先对条件字符串分词,然后用这些词作为KEY在哈希表中取对应的行集合,对这些行集合求交集或并集就行了。
网页搜索引擎都是这么做的,咱们一点搜索,0.几秒就能出结果。说起来容易,做起来难,LZ好运。
你所说的>>"查找时先对条件字符串分词,然后用这些词作为KEY在哈希表中取对应的行集合,对这些行集合求交集或并集就行了"不甚了解。好比我遍历这个hstb int i=0;
bool cd=false;
string[] str={"欢迎","来到","csdn"};
foreach (DictionaryEntry ts in hstb){
if(str.Equal(ts.Key.toString()){
cd=true;break;
}
}也要遍历好多次,而记录数也不少.没做这过方面,不知能否详细告知,不胜感激.
bool cd=false;
string[] str={"欢迎","来到","csdn"};
foreach (DictionaryEntry ts in hstb){
if(str[i].Equal(ts.Key.toString()){
cd=true;break;
}
i++;
}
{
if (Regex.IsMatch(s, "(欢迎|来到|csdn)"))
break;
}测试10w条数据,每个字符串1k(总100M),用时4秒(个人认为没什么必要为这4秒钟去优化)
一本全面彻底讲解字符串查找算法的书。书中讲解了34个字符串查找算法的思想。每个算法都有适用性的描述。每个算法都有逐步推演的例子(图解)。每个算法都有代码(C语言)。每个算法都有复杂度分析。每个算法都有进一步的参考文献。
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;var list = new List<string>();
for (int i = 0; i < 1000000;i++ )
{
list.Add(i.ToString());
}
try
{
list.Single(x =>
{
if (Regex.IsMatch(x, "(欢迎|美女)"))
{
return true;
}
return false;
});
}
catch
{
throw new System.Exception("有多条记录");
}
关键点:不是遍历哈希表,而是在哈希表中直接取值
object obj1 = hstb["欢迎"]; //行集
object obj2 = hstb["来到"]; //行集
在哈希表中,是根据索引值直接定位取值,而不是查找或遍历。
这两句的用时大约在纳秒级。我最近也在做行业搜索,大约十亿个网页,不好做啊,大家一起讨论吧。
另有10.5%左右需要处理模式串识别,输出结果,需要7%左右 可以据此经验,调整程序结构。多线程可以用在加载待处理串和结果输出上。 但在进行匹配时,就不要了。此时,可以提升匹配线程权重到最高级别,加快运算。 算法方面,可选的有几百种,最简单,常用的strstr() 就是QS算法, 根据模式串的特点,有不同的算法选择。
另要根据待匹配串的特点,也有不同的算法可供选择。 这些需要经验判别。 简单说下,供你参考。