我正在编写一个程序,该程序将用户提交的查询与关键字列表进行匹配。这份名单大约有2000字,表现最重要。快速关键字查找
老
它更快到此列表存储在 源代码 SQL表或硬编码呢?该列表不需要经常更新 。
如果SQL表速度较快,哪个数据类型最好的是 ? (Int, Nvarchar?)
如果硬编码列表更快,那么数据 类型将是最好的? (List?)
有什么建议吗?
什么是用于快速查找的最佳内存数据结构?
我正在编写一个程序,该程序将用户提交的查询与关键字列表进行匹配。这份名单大约有2000字,表现最重要。快速关键字查找
老
它更快到此列表存储在 源代码 SQL表或硬编码呢?该列表不需要经常更新 。
如果SQL表速度较快,哪个数据类型最好的是 ? (Int, Nvarchar?)
如果硬编码列表更快,那么数据 类型将是最好的? (List?)
有什么建议吗?
什么是用于快速查找的最佳内存数据结构?
名单并不需要被经常
我说,如果以往任何时候都需要更新它不会在源代码属于它更新。
存储此数据的性能无关紧要。
如果你开始你的计划,你加载字符串数组一次从数据存储您存储它。然后你可以一直使用这个数组,直到你退出程序。
这是正确的答案。他坚持认为数据实际上是不相关的。正确的问题是用于快速查找的最佳内存数据结构是什么?如果数组被排序以便可以使用二分搜索(现在我们是'O(log n)',其中'n'是关键字的数量),那么数组就很好。如果这个速度不够快(在分析后!)可以考虑一个线索。 – jason 2009-11-25 02:07:46
是的,这是迂腐的...但是,不是一组字符串的二进制搜索真的O(log(N)* log(K))其中N是单词的数量,K是中位数字长度? – 2009-11-25 04:00:05
最糟糕的情况是'O(m log n)',其中'm'是最大字长,'n'是关键字的数量。 – jason 2009-11-25 14:32:52
如果列表大部分是静态的,并且您可以花费一些时间准备(即在应用程序启动时),那么您最好将关键字列表存储在文本文件中,然后使用说B *树在内部存储关键字(假设你只关心精确匹配而不是部分匹配或Levenshtein距离)。
IMO,如果列表没有经常更新,请将其存储在文件(text/xml)中,然后将其缓存到应用程序中,以便下一次请求更快。
+1 - 这是使用缓存的理想情况。 看看http://stackoverflow.com/questions/1308354/asp-net-caching-vs-static-variable-for-storing-a-dictionary – CoderHawk 2009-11-25 04:00:02
好,响应你的编辑(基本上解除我的评论到一个答案):
事先指定你期望的性能。
将您的应用程序编码为排序后的数组,并使用二进制搜索在数组中搜索关键字。这是非常简单的实施,并提供体面的表现。然后通过配置文件查看它是否符合您的要求。如果这种表现可以接受,继续前进。这里最糟糕的表现是,其中n
是关键字的数量,m
是关键字的最大长度。
如果步骤2中的性能不可接受,请使用trie(也称为前缀树)。这里预期的性能是m
,其中m
是您的关键字的最大长度。配置文件以查看这是否符合您的预期性能。如果没有,请重新审视您的绩效标准;他们可能是不合理的。如果你仍然不符合你的性能规范,考虑使用散列表(在.NET中你会使用HashSet<string>
。虽然散列表会有更差的最差情况下的性能,但它可以有更好的平均情况下的性能(如果有的话)没有冲突的哈希表查找是O(1)
而散列计算功能O(m)
其中m
是关键字的最大长度),这可能会更快(平均),但可能不会显着如此。
你甚至可能考虑直接跳到最后一步(因为它比前者简单),这一切都取决于哟你的需求。例如,尝试可以轻松地吐出最接近的匹配关键字。
这里重要的是要有你的性能要求和配置文件的规范!使用最简单的实现来满足你的性能要求(为了可维护性,可读性和可执行性(如果不是这样,现在这是一个词))
可能会在一个月内发生一些小的变化 – program10 2009-11-25 01:54:56
@ program10:Marel K是对的。特别是如果它是每月一次;这太频繁,甚至无法被远程考虑嵌入到源代码中。 – jason 2009-11-25 01:59:55
从长远来看,这有很多源维护,并且在部署新版本时完全不必要的停机。就像codymanix所提到的 - 只是从SQL中加载并缓存它 - 这是一个更可维护的选项,而不是修改源代码来更新字符串值。 – 2009-11-25 02:00:07