5

有一群人 [比如说 1874 人],他们都代表世界上不同的公司 [比如说 236 人]。我的任务是最好地确定每个人工作的公司。诀窍是我不能简单地问一个人“你在哪里工作”并得到答案,但我所拥有的是一份包含许多问题的问卷 [比如说 290 个问题] 以及我应该期望员工的确切回答每个公司的。有些公司可能有相同的答案,所以最后,即使我不能确切地确定一个人在哪家公司工作,我应该能够缩小范围并说他/她必须为其中一家公司工作。

使用多值映射和其他一些数据结构,我已经确定了我可以用 1 个问题 [query] 识别的所有公司。使用这些查询来表示树数据结构的根,我需要使用其他查询/问题作为分支来构建树的其余部分以识别其余部分。

有什么建议/帮助/建议吗?

4

3 回答 3

2

根据您在评论中的回答,我觉得您不妨让树的每个级别代表一个问题,而该级别节点的分支/子节点代表答案。正如 btilly 所提到的,这在技术上是一个尝试。

一个更有效(尽管不一定是空间方面)的解决方案可能涉及使用哈希表和一个哈希函数,该哈希函数作用于答案选择以创建其哈希,但我认为考虑到您的要求和不要使用 trie 是最好的方法没关系。

哦,对了:根据答案选择的布局方式,您可能会在几个级别没有任何子分支/树的特定分支上获得一系列答案;在这种情况下,您可能会将那些单一的分支部分折叠成单独的节点。http://en.wikipedia.org/wiki/Trie#Compressing_tries也可能提供一些提示。


根据您对我最初回答的回复,这是我的想法:

为问题及其答案选择保留一组节点,每个答案选择都与一个哈希表(或您希望使用的任何数据结构)相关联;由于经常使用 Python 并且习惯于Python 的set数据结构,它被实现为一种哈希表)包含指向每个公司的指针,或者如果给定问题的给定答案将指示公司开始,则指向单个公司的指针。

当您第一次检查特定问题的答案时,并且有多家公司与该答案选择相关联时,将第一个答案的哈希表中的数据临时复制为链接列表或其他内容。随着更多问题的回答,请对照每个新答案的哈希表检查列表中的元素,并从列表中删除每个新答案的哈希表中不存在的公司。重复提问过程,直到 1) 列表中只剩下一家公司,2) 列表中没有任何公司,或 3) 您已提出所有问题。

如果是 1),那是问答者的雇主。
如果是 2),则该员工未受雇于任何公司进行检查,和/或某处存在错误。
如果是3),则留在链表中的公司是问答者可能受雇的公司。

可能有一种更有效的方法可以做到这一点,因为我的实现至少需要 580 个哈希表(每个答案一个,每个问题至少有 2 个答案),但我现在真的想不出任何东西。

于 2011-06-14T13:53:25.280 回答
2

从根开始递归地构建树。在每个步骤中,您都会有一组有效的问卷,最初将是所有问卷。从活动问卷中,选择一个问题,该问题的肯定答案与否定答案一样多。为这个问题制作一个树节点。使用对您在此节点选择的问题回答“是”的子集问卷创建一个“是”子树(递归)。还可以使用对您选择的问题回答“否”的问卷子集创建一个否子树。

简单示例:

假设我们试图猜测动物,我们有来自熊、斑马、鲑鱼和鳄鱼的问卷。

我们查看问卷,发现大约一半的人对“你是哺乳动物吗?”说“是”,所以我们将其作为树的根。

现在我们只接受对那个问题说“是”的问卷。在我们的示例中,它们来自熊和斑马。我们选择“你有条纹吗?”这个问题,因为大约一半的人说是,一半的人说没有。由于每个答案只有一份问卷,因此您可以创建叶节点来猜测斑马并适当地承受。

现在我们回溯到根节点并对“否”分支重复该过程。也就是说,我们查看鲑鱼和鳄鱼的问卷,并选择一个问题,将它们分为不同的组。“你喜欢笑吗?” 符合要求。

最终的树如下所示:

Ask: "Are you a mammal?"
 |
 +- yes -> Ask: "Do you have stripes?"
 |          |
 |          +- yes -> Guess: Zebra
 |          |
 |          +- no --> Guess: Bear
 |
 +- no --> Ask: "Do you like to smile?"
            |
            +- yes -> Guess: Crocodile
            |
            +- no --> Guess: Salmon
于 2011-06-14T16:35:28.763 回答
0

Building an Expert system using Prolog is one possible solution. Have you considered this option ?

By doing so, you may even add some Natural Language Processing capabilities easing interaction with users.

于 2011-12-10T16:44:47.057 回答