algorithm - 指纹树生成

标签 algorithm data-structures tree depth-first-search breadth-first-search

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

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

任何意见/帮助/建议?

最佳答案

根据您在评论中的回答,我觉得您也可以让树的每一层代表一个问题,该层上节点的分支/子节点代表答案。正如 btilly 所提到的,这在技术上是一个特里树。

更有效(虽然不一定是空间方面)的解决方案可能涉及使用哈希表和哈希函数,哈希函数作用于答案选择以创建其哈希,但我认为 trie 是满足您的要求的最佳方式和不在乎的。

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


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

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

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

如果是1),就是答题者的雇主。
如果 2),该员工未受雇于任何公司进行检查,和/或某处有错误。
如果3),链表中剩余的公司就是问答者可能就职的公司。

可能有一种更有效的方法来执行此操作,因为我的实现需要至少 580 个哈希表(每个答案一个,每个问题至少有 2 个答案),但我真的想不出任何正确的方法现在。

关于algorithm - 指纹树生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6344276/

相关文章:

c++ - 将通用堆栈容器实现为适配器类模板

c - 替代c中的多维数组

python - 有多少种方法可以构建完美平衡的树?

c - 使用 C 中的表达式树计算后缀表达式

c++ - 在 C++ 中搜索树中节点的最快方法

algorithm - 有 N 座石头塔和 2 名玩家的游戏

algorithm - F#写红黑树的难点

python - 使用 LU 分解实现 Ax = b 求解器时遇到问题

algorithm - 图值传播算法

swift - 如何计算循环的时间复杂度 - Swift