C++模糊解算器:在集合中查找前缀
C++ Boggle Solver: Finding Prefixes in a Set
这是一项家庭作业,所以我不想要确切的代码,但如果有任何想法可以帮助我指明正确的方向,我将不胜感激。
任务是编写一个解决难题的程序。我已经记下了递归部分,但我需要一些关于如何将当前字符序列与字典进行比较的见解。
我被要求将字典存储在一个集合或排序列表中。我一直在尝试使用集合来实现这一点。为了让程序运行得更快,不走死胡同,我需要检查当前的字符序列是否作为集合(字典)中任何字符的前缀存在。
我发现set.find()操作只有在字符串完全匹配的情况下才返回true。在实验室要求中,教授提到:
如果字典存储在一个集合中,许多数据结构库提供了一种方法,可以在集合中查找与您正在搜索的字符串最接近的字符串。这样的操作可以用来快速查找具有给定前缀的单词。
我今天一直在找一本教授所描述的书。我已经找到了很多关于尝试的信息,但由于我需要使用列表或集合,我认为这行不通。
我也尝试过查找自动完成函数的算法,但我发现的算法对于我在这里要完成的任务来说似乎非常复杂。
我也曾想过使用strncmp()将当前序列与字典集中的单词进行比较,但同样,我不知道在这种情况下它会如何发挥作用。
是否值得继续研究这在一个集合中是如何工作的,或者我应该尝试使用排序列表来存储我的字典?
感谢
@Raymond Hettinger在回答中提到,trie在这里非常有用。然而,如果你对编写trie感到不舒服,或者更喜欢使用现成的组件,你可以使用单词按字母顺序排列的可爱属性来检查O(logn)时间是否存在给定的前缀。这个想法如下-例如,假设你正在检查前缀"thr"。如果你注意到,每个以前缀"thl"开头的单词都必须夹在字符串"thr"answers"ths"之间。例如,thr≤通过<ths和thr≤喉咙<ths。如果你将单词存储在一个巨大的排序数组中,你可以使用二进制搜索的修改版本,按字母顺序查找第一个单词——至少是你选择的前缀,按字母排序查找第一个词——至少是下一个前缀(取前缀的最后一个字母并递增)。如果它们是同一个词,那么它们之间没有任何东西,前缀也不存在。如果它们不是,那么它们之间有某种东西,前缀起作用。
由于您使用的是C++,因此有可能使用std::vector
和std::lower_bound
算法。您还可以将所有单词放入std::set
中,并使用set
版本的lower_bound
。例如:
std::set<std::string> dictionary;
std::string prefix = /* ... */
/* Get the next prefix. */
std::string nextPrefix = prefix;
nextPrefix[nextPrefix.length() - 1]++;
/* Check whether there is something with the prefix. */
if (dictionary.lower_bound(prefix) != dictionary.lower_bound(nextPrefix)) {
/* ... something has that prefix ... */
} else {
/* ... no word has that prefix ... */
}
也就是说,trie在这里可能是一个更好的结构。如果你感兴趣,还有另一种数据结构称为DAWG(有向无循环字图),它与trie类似,但使用的内存要少得多;在斯坦福大学的CS入门课程中(Boggle是一项作业),学生们实际上得到了一份包含该语言中所有单词的DAWG。还有另一种数据结构,称为三元搜索树,它介于二元搜索树和trie之间,如果你想研究的话,它可能在这里很有用
希望这能有所帮助!
trie是解决此问题的首选数据结构。
如果你只限于集合和字典,我会选择一个将前缀映射到可能匹配的数组的字典:
asp -> aspberger aspire
bal -> balloon balance bale baleen ...
- Python 集合.计数器,如何避免重复查找
- 如何查找集合的所有分区 (C++)
- 如何在集合中的特定字符串中查找子字符串
- 在集合中查找使用结构C++的元素
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 在具有自定义对象的集合中查找值
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 使用STL算法查找集合中的所有匹配项
- 在集合中查找结构向量
- 使用 STL 算法查找集合中的前两个不相邻元素
- 如何查找数组集合中第二大元素的索引
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 查找集合中第k个最大元素
- [唯一相等运算符]在集合中查找重复元素并将其分组的快速算法是什么
- C++模糊解算器:在集合中查找前缀
- 更好的std::在指针集合上查找,并将取消引用的值与常量引用值进行比较
- 查找两个集合之间的邻近匹配对
- 在包含自定义类型的集合中查找
- 在任意加长的集合中查找最大数不起作用
- 在结构体集合中查找项