当存储在数据结构或长字符串中时,在键值对的键中搜索子字符串更有效



我有一个字符串搜索问题,关于如何实现它,我想到了两个想法。我想知道人们是否可以指出哪种方法会给我带来更高效的性能,甚至可能提出更好的方法?

问题是我有一个大约450kb的文本文件,其中包含以下格式的数据:

description1, code1n
description2, code2n
description3, code3n
...

它是由逗号分隔的两列数据,每条记录由描述代码组成。

代码是一个简短的三个字符的文本,对用户来说没有即时意义,这就是为什么代码中会有描述数据。

描述数据是一个短句,用于向用户描述代码的含义。

我正在尝试创建一个GUI,用户可以在可编辑的文本字段中输入搜索关键字,然后用于根据描述数据进行搜索。然后,系统将返回所有过滤后的记录,即,将关键字作为子字符串的所有描述数据以及与其配对的代码,供用户选择。用户键入的每个字符都会出现这种情况。

关于如何实现此功能,首先想到的想法是使用描述数据作为关键字创建一个键值对集合,例如NameValueCollection,然后使用foreach循环遍历每个记录,并在关键字中搜索匹配的子字符串。

第二个想法是将整个文本文件读取为一个长字符串,并使用String.IndexOf()方法搜索关键字,在搜索中有命中的地方,我提取记录的那部分返回给用户。

我想到了第二个想法,因为我担心第一个想法可能会对性能产生影响。我读到StringComparison.Ordinal使用的IndexOf方法比Boyer–Moore字符串搜索算法性能更好,所以我认为以这种方式实现它会有更好的性能?

因此,在关键字中搜索子字符串时,将整个文件存储为字符串或NameValueCollection是否可以提供更快的检索,或者有更好的方法吗?

如果您有一个广泛的字符串集合,计划搜索完全相同的子字符串,那么您有很多可用的选项。

一种选择是使用Aho-Corasick字符串匹配算法在文件的每一行中搜索搜索查询。执行此操作的总运行时间将为O(m+n+z),其中m是查询的长度,z是总匹配数,n是文件中所有字符串中的字符总数。

一个更好但更复杂的选择是从文件的所有行中构建一个通用后缀树。然后,您可以在时间O(n+z)中找到所有匹配的行,其中n是要搜索的模式的长度,z是文件中的行总数。这需要O(m)预处理时间,其中m是文件中的字符总数。这比第一个选项快得多,但您可能必须找到一个好的后缀树库,因为后缀树构建算法相当复杂。

希望这能有所帮助!

最新更新