有关20个问题游戏的问题被问到here:
但是,如果我正确理解它,答案似乎就是假设每个问题都会在一个分层树上。如果游戏是这样的话,二叉树应该可以工作:
因为猫是哺乳动物的一个例子,哺乳动物是动物的一个例子。但如果问题是这样的呢?
你不能用这些问题分枝树,因为有很多掠食者不是哺乳动物。所以你不能把你的程序缩小到哺乳动物的范围,让捕食者成为哺乳动物的一个子集。
那么有没有办法使用我不理解的二元搜索树,或者是否存在针对此问题的不同算法?
为了澄清一下,我只用了20个问题作为例子,所以我的问题是关于这种搜索问题,而不是20问题游戏中特别涉及的其他问题。
答案 0 :(得分:2)
它被比作二分搜索,因为每个问题都是肯定/否定,所以每个答案都将你的剩余集分成两部分。但是,数据集很可能不存储在实际的二叉树中,因为正如您所知,只有在问题总是以与树分割维度相同的顺序询问时才能使用。
此外,您可以轻松地拥有超过20个维度(“属性”)来分割事物,并且这些20个中的一些可以由多个对象共享(因此20级二进制文件的叶节点)树不一定只包含一个项目)。
因此,“二分搜索”只是对实际情况的隐喻,因为在每一步中你都会尝试选择最能将你剩下的一组分成两半的属性。就实际的数据结构而言,你必须使用别的东西。
答案 1 :(得分:0)
如果您需要坚持使用二叉树来解决问题,那么没有任何迹象表明您无法复制分支或节点。将猫科动物答案节点放在多组决策的末尾。或者问捕食者问题两次 - 一次是否用户对哺乳动物说“是”,一次用户说“不”。
如果你采取这种方法,当然会有优化和效率问题,但也有解决特定问题的方法。 (例如,如果您担心决策树的存储空间,那么请创建分支或节点或指向不可变对象/声明的指针。)
答案 2 :(得分:0)
我相信你所寻找的东西通常被称为Decision Tree,特别是分类。然后,您可以使用C4.5之类的算法来学习如何有效地对问题进行排序。
答案 3 :(得分:-1)
如果您正在寻找完全匹配 - 只需在所有属性上进行哈希并进行查找。
如果你想进行模式识别以找到类似的项目,你可以使用一个具有非常“线性”映射的方法 - 比如k-最近邻居。例如,您可以使用kd树来表示搜索空间。