优化一个vb.net代码,该代码使用一个非常大的字符串列表,超过400000个条目

优化一个vb.net代码,该代码使用一个非常大的字符串列表,超过400000个条目,vb.net,list,Vb.net,List,我使用一个唯一字符串T(法语词典)的静态列表,包含402325个条目。我的代码正在玩拼字游戏,并使用一种称为DAGGAD的特殊构造来构造可玩单词,并验证单词是否确实在列表中。有没有比list.indexof(T)更快的方法来查找单词是否存在?我查看了HashSet.Contains(T),但它没有使用我可以用来检索单词的索引。例如,对于给定的一轮游戏,可能有数千个有效的解决方案:我实际上只存储列表的索引,但使用哈希集,我将无法做到这一点,必须存储所有单词,这会增加内存使用。在大多数情况下,解决方

我使用一个唯一字符串T(法语词典)的静态列表,包含402325个条目。我的代码正在玩拼字游戏,并使用一种称为DAGGAD的特殊构造来构造可玩单词,并验证单词是否确实在列表中。有没有比list.indexof(T)更快的方法来查找单词是否存在?我查看了HashSet.Contains(T),但它没有使用我可以用来检索单词的索引。例如,对于给定的一轮游戏,可能有数千个有效的解决方案:我实际上只存储列表的索引,但使用哈希集,我将无法做到这一点,必须存储所有单词,这会增加内存使用。在大多数情况下,解决方案是在一到两秒钟内找到的,但在某些情况下(即空白),它最多需要15秒钟,如果有可能的话,我需要使用VB来减少这一时间

正如Craig所建议的,在T的排序列表上使用List.BinarySearch(T)可以将速度提高10倍左右。与我使用IndexOf时的15到20秒相比,现在使用空白字母的拼字游戏只需1到2秒。

我只能找到GADDAG(in)的参考,你有DAGGAD的链接吗?HashSet可能是最快的,但会带来存储开销:这篇类似的文章中有一些很好的信息,所以如果你的列表被排序,你可能可以在上面实现你自己的二进制搜索。这可能比
IndexOf
更快,我希望它必须假设列表未排序并进行线性搜索。您还可以查看其他容器,例如,我认为trie是为您所需要的用途而设计的,但是您必须编写整个容器(或找到现有的实现)。谢谢Andrew。你提到的那篇文章是我的出发点。与SQL相比,使用GADDAG可以显著提高性能。一旦我的代码找到一个可播放的单词,它只存储列表中的索引,这比存储单词占用的内存少,但需要额外的步骤才能在列表中找到索引。这就是我想要加快的。谢谢克雷格。我在排序列表上从IndexOf改为BinarySearch,这是一个很大的改进,大约快了10倍。