日期:2014-05-20  浏览次数:20786 次

*****给坛子里的sp1234之类的大shi:能不能看清楚帖子说啥再喷
帖子地址:http://topic.csdn.net/u/20120720/11/f833b1c7-5335-4c81-bb43-26b60360056b.html

里面不少自认为是牛人的(也许真的是),也许可能水平比我高
但是也请看清楚问题再回答好吗?

明明是在集合里查询子串,也能扯到二分法,我那个去

------解决方案--------------------
坐等
喷者

------解决方案--------------------
换用 JAVA, 一切都会好的, 
没有争端, 天下大同, 鸟语花香...
------解决方案--------------------
从来没去过技术区,我水平太低,什么都不会。
------解决方案--------------------
lz 
这叫技术障!
回头是岸,苦海无边

------解决方案--------------------
习惯就好。。
------解决方案--------------------
完全看不懂啊,弱智了
------解决方案--------------------
数据结够啊,够不够
------解决方案--------------------
LZ说的是sp大屎吗
------解决方案--------------------
SP大神在坛子里曾经帮助过很多人。为了这些帮助 谢谢。对于帮助过你的人要感恩。。
没有谁好,没要谁坏。谁帮助了你,你要感恩。没帮上你你也要感谢,毕竟是在帮你。。
------解决方案--------------------
C# code


            Dictionary<string, Int32> dic = new Dictionary<string, Int32>();
            Random rnd=new Random ();
            for (int i = 0; i < 500000; i++)
            {
                dic[Guid.NewGuid().ToString() + Guid.NewGuid().ToString()] = rnd.Next();
            }
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
       

            for (int i = 0; i < 2; i++)
            {
                sw.Reset();
                sw.Start();
                List<string> list = new List<string>();
                foreach (KeyValuePair<string, int> key in dic)
                {
                    if (key.Key.Contains("dadf"))
                    {
                        list.Add(key.Key);
                    }
                }
                sw.Stop();
                
            }

            System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds.ToString());

------解决方案--------------------
你大方向搞错了,别人想引导你,你还不愿意听。虽然有些话不中听,有些人喜欢盛气凌人。该听还得听。乖。。
------解决方案--------------------
词库是需要维护的,每个行业可以定义自己专有的词库
有些词你是不用考虑的
为了某些很小的词,浪费很大的性能,划不来。
------解决方案--------------------
查子串其实是很不专业的做法。效率极其低下,资源浪费极其严重。

正常说来,(那些专业的搜索网站)会先建立一个关键词词典,
然后通过二分法在词典中查找关键词。
lucence大致也是这个原理。

所以sp1234说的也没错。


------解决方案--------------------
良药苦口,虽然被喷的滋味很难受,但其实是帮你提高,你该感谢才是啊
------解决方案--------------------
C#处理楼主所说的类似sql的like有优势?我倒是认为决定性能的是算法(设计方案)

稍微复杂一点的需求,往往其设计的实质就是分多步(多层)去实现,
并且可以在过程中根据不同的自己采用不同的策略处理(也就是多路径)实现,
比如,很多时候,仅仅查出含有首个字符的结果集,已经能把范围缩小n数量级了,
那如果,第一个匹配效果不理想,是否去匹配首2个字符(或者第2个字符),从而尽可能第一次检索就可以得到小一点的子集,
还有,可以尝试自己建立一些检索标的表而不是依赖现成的索引

设计任务就是去实现需求,
而不要目标盯着"代码可读性和性能的取舍",
我所接触的客户好像从来没有要求过"代码可读性"
------解决方案--------------------
DICTIONARY<>本身是基于HASH存放的,是用空间换时间的典型做法,你拿这玩意存放你的数据结果却循环每一个KVP来进行查找。针对你的场景是不合适的。
------解决方案--------------------
全文索引比like的效率高的不是一倍两倍,但是就是有一点如lz所说的分词问题
有一个文件可以配置这个分词的,在准确率可以基本达到要求的情况下还是用全文索引好
如Lz说的谷歌没有分词问题,猜测是对字符串进行全分词(不考虑常用词)后建索引的