C# 快速关键字查找

C# 快速关键字查找,c#,web-applications,C#,Web Applications,我正在编写一个程序,将用户提交的查询与关键字列表进行匹配。这个列表大约有2000个单词,性能是最重要的 旧的 将此列表存储在 SQL表或在 源代码?该列表不需要修改 经常更新 如果SQL表的速度更快,当哪些数据 类型最好?Int, Nvarchar 如果硬编码列表速度更快,哪些数据 类型最好? 名单 有什么建议吗 用于快速查找的最佳内存数据结构是什么 该列表不需要经常更新 我说,如果需要更新,它不属于源代码。这与存储此数据的性能无关 如果启动程序,将从存储字符串数组的数据存储中加载字符串数组一次

我正在编写一个程序,将用户提交的查询与关键字列表进行匹配。这个列表大约有2000个单词,性能是最重要的

旧的

将此列表存储在 SQL表或在 源代码?该列表不需要修改 经常更新

如果SQL表的速度更快,当哪些数据 类型最好?Int, Nvarchar

如果硬编码列表速度更快,哪些数据 类型最好? 名单

有什么建议吗

用于快速查找的最佳内存数据结构是什么

该列表不需要经常更新


我说,如果需要更新,它不属于源代码。

这与存储此数据的性能无关


如果启动程序,将从存储字符串数组的数据存储中加载字符串数组一次。然后您可以一直使用此数组,直到退出程序。

硬编码列表速度更快。数据库命中以检索列表无疑要比从内存对象中提取列表慢


至于在哪个数据类型中存储值,数组可能比列表更快,占用的内存更少,但事实并非如此。

如果列表基本上是静态的,并且您可以花费一些时间进行准备,即在应用程序启动时,您最好将关键字列表存储在文本文件中,然后使用B*树在内部存储关键字,假设您只关心精确匹配,而不关心部分匹配或Levenshtein距离。

IMO,如果列表不经常更新,请将其存储在filetext/xml中,然后缓存在应用程序中,以便下一个请求更快。

好的,要回应您的编辑并基本上将我的评论提升为答案:

提前指定您期望的性能

根据排序数组编写应用程序代码,并使用二进制搜索在数组中搜索关键字。这是非常简单的实现,并提供了体面的性能。然后配置文件以查看它是否符合您所需的性能。如果此性能可以接受,请继续。这里最糟糕的性能是Om log n,其中n是关键字的数量,m是关键字的最大长度

如果步骤2中的性能不可接受,请使用也称为前缀树的trie。这里的预期性能是m,其中m是关键字的最大长度。配置文件以查看这是否符合您的预期性能。如果没有,请重新审视您的绩效标准;他们可能不讲道理

如果您仍然没有满足您的性能规范,请考虑在.NET中使用哈希表,您将使用hash集。虽然哈希表的最坏情况性能较差,但如果没有冲突,它的平均情况性能会更好。哈希表查找为O1,而哈希计算函数为Om,其中m是关键字的最大长度。平均而言,这可能更快,但可能不明显

你甚至可以考虑跳过到最后一步,因为它比前者复杂得多。这完全取决于你的需要。例如,尝试的优点是可以轻松地吐出最接近的匹配关键字


这里最重要的是要有一个性能要求的规范,并对其进行分析!使用最简单的实现来满足您在可维护性、可读性和可实现性方面的性能要求。如果不是,那现在就是一个词了

也许每天都会有一些小变化month@program10当前位置Marel K是对的。尤其是每月一次;这太频繁了,甚至不能远程考虑嵌入到源代码中。从长远来看,这需要大量的源代码维护,而且在部署新版本时完全不必要的停机时间。正如codymanix所提到的,只需从SQL加载并缓存它,这是一个比只需修改源代码来更新字符串值更易于维护的选项。如果在从数据库启动时进行初始检索后将其缓存在本地,则不会如此。@Jason-对于后续的命中,为True。但是,第一次命中的速度会慢一些。@Kevin Pang:第一次命中是不相关的。@Jason很有可能,但你不能确定。如果B*树是动态插入和删除的,那么它是好的,但是对于静态列表,排序数组是好的。与排序数组相比,B*树的复杂性没有优势。B*树不一定是正确的答案,但我建议在排序数组上使用树结构的原因是搜索速度。搜索一棵树是Olog N,而搜索一个数组甚至一个已排序的数组也是ON。我在哪里可以阅读更多关于部分匹配或Levenshtein距离的信息?可能需要使用这些later@Simon里格哈特:你可能想重新思考关于搜索排序数组的最后一句话。@Jason:叹气。我应该把思考作为发帖的先决条件。不知怎的,我弄糊涂了
在搜索未排序的数组(ON)和搜索已排序的数组(使用二进制搜索是Olog N)之间切换@程序10:下面的See也:链接应该给你一个合理的起点。这是正确的答案。他坚持认为数据实际上是无关紧要的。正确的问题是什么是用于快速查找的最佳内存数据结构?如果对数组进行排序,以便可以使用二进制搜索,那么就可以使用数组了,现在我们使用的是Olog n,其中n是关键字的数量。如果分析后速度不够快!可以考虑试一试。是的,这太迂腐了。。。但是,对一组字符串进行二进制搜索不是真的吗?其中N是字数,K是字长中值?最坏的情况是Om log N,其中m是最大字长,N是关键字数。+1-这是使用缓存的理想情况。看一看谢谢你的详细回复。我是c语言的新手,我只想写一个reg-exp-wordA | wordB | word\sC这个速度够快吗?您介意为您提到的方法提供一些示例代码吗?我还在学习。谢谢,不要用那样的正则表达式。它不是适合这项工作的工具,维护这样一个硬编码的正则表达式字符串将是一场噩梦。