我正在做一个小型项目,并尝试制作一个程序,当您输入一个单词时,它将从大约70000个单词的大数据库中找到字谜,它还需要具有相同数量的字符,例如((dogs =神而不是神或狗)。
到目前为止,我设法进行了搜索,当我进行搜索时,我会找到所有包含所写单词一部分的单词
public ActionResult CheckAnagram(string word)
{
IQueryable<Anagram> wordDictionary = db.Anagrams;
if (!String.IsNullOrEmpty(word))
{
wordDictionary = wordDictionary.Where(a => a.Name.Contains(word));
}
return View(wordDictionary.ToList());
}
我不确定执行此操作的最佳方法是什么,这是一个很大的数据库,我可以想象的是,我必须多次执行并继续重新排列单词以检查每种可能性。
这是最佳解决方案吗?还是有另一种方法?
我对如何编写此代码有所了解,但在我看来这并不是最好的方法。如果不太明显,我非常适合初学者...
一种简单的方法是将每个单词存储在这样的表中:
Key | Value
---------------
dgo | dog
dgo | god
act | act
act | cat
act | tac
键是按字母顺序排列的单词的字母,而值是实际单词。
然后,要查找tac
的字谜,您只需要按字母顺序对字母排序,然后执行简单的查找。
这将使您获得非常快的性能。
一个简单的优化方法是对密钥进行哈希处理,以提高查找速度并减少数据存储,但必须确认每个单词都是真正的字谜(因为哈希可能会导致冲突,尽管这种情况非常少见) 。
显然,如果要存储在数据库中,则将键和值存储在单独的表中并将它们连接在一起可能会提供出色的性能。