【问题标题】:Merging Two Unsorted and Unsortable Trees合并两个未排序和不可排序的树
【发布时间】:2011-12-14 11:07:30
【问题描述】:

是的,我正在学习 CS,并且已经完成了一个 C 实验室,一切进展顺利,但我现在遇到了一些似乎无法解决加分的问题。我已经做了一两天了,根本想不出一个正确的方法来完成这个。

简介

到目前为止的任务总结:

构建穿山甲游戏,计算机将问题和对象存储在树形结构中。游戏的工作原理如下:您想到一个对象,计算机通过询问您一系列“是/否”问题来尝试猜测您在想什么。如果计算机猜对了,它就赢了。如果你设法欺骗了它,你就赢了,但你必须向计算机提供一个问题,让它在下一轮正确猜测。仅此而已。

您最终得到的树结构示例(从左->右):

                Tree
                /
        Is it made of wood?
                \
                Grass
        /
Is it green?
        \
                Pangolin
                /
        Does it have a legs?
                \
                                Computer
                                /
                        Is it larger than a microwave?
                                \
                                Laptop
                        /
                Does it have a keyboard?
                        \
                        Desk

这是由以下结构组成的:

typedef struct node {
  char* object_name; // object-name (which may be NULL)
  char* question; // question (which may be NULL) 

  struct node *yesNode; // where if yes (NULL)
  struct node *noNode; // where if no (NULL)
} node;

上面的树存储为以下文件:

Is it green?
Does it have a legs?
Does it have a keyboard?
        Desk
Is it larger than a microwave?
        Laptop
        Computer
        Pangolin
Is it made of wood?
        Grass
        Tree

问题

奖金如下:

让你的程序接受任意数量的输入文件,然后嫁接 他们一起组成一棵巨大的树。与朋友交换文件 并收集大量无意义的问题。正确地做到这一点 您需要扫描重复条目(您将无法执行此操作 完美,但它至少应该清除明显的重复项和 以合理的方式将树木嫁接在一起。)

或总结:

获取两个树结构(或表示树结构的文件)并将它们合并在一起以生成更大的树,同时删除重复项。

我的问题:

  1. 如何删除两棵未排序的树?
  2. 甚至可以在不手动检查每个节点的情况下删除重复项吗?
  3. 如何甚至循环到每个节点的底部并将其与另一棵树进行比较?

我最好的主意:

  1. 在第二棵树中搜索第一棵树中的对象
  2. 用穿山甲对象替换那些对象
  3. 在第一个中查找所有出现的穿山甲
  4. 改为将父级指向第二棵树的顶部

但这会破坏树结构,并可能导致游戏中断(比如第一棵树中的首要问题是它是红色的)并且第二棵树被附加到 no 节点上并且第二棵树中的所有项目都是红色的?

我的主要问题:

  • 您知道如何解决这个问题吗?还是一种可行的hack?
  • 您如何在两棵树中找到重复项?
  • 如何将树木连接在一起?
  • 如何循环遍历每棵树的底部?

【问题讨论】:

  • 假设您和一个朋友各有一棵树,上面有一个问题和两个答案。假设你的是“它是用木头做的吗?”答案是“铅笔”和“汽车”,而你朋友的答案是“它比微波炉还大?” (“桌子”/“笔”)。我不知道您如何完全合并这些树。
  • 我认为你们完全没有抓住重点!

标签: c tree


【解决方案1】:

我认为加入所有树的最简单方法是重新构建最小熵决策树,如下所示:

  1. 考虑所有项目。
  2. 创建一个新节点。
  3. 对于节点,选择区分当前项目集中最多项目的问题:
    • 请注意,问题区分的项目数是问题出现的每棵树中问题下所有项目的总和。
  4. 根据问题拆分项目集。
  5. 从第 2 步开始对两个新集合中的每一个重复重复。

当涉及到将逻辑相同但语言不同的问题联系起来时……这是一个极其困难的自然语言问题。无需进行任何语言分析,您就可以做一些简单的事情,例如比较问题字符串,忽略大小写、标点和空格。

【讨论】:

  • 好主意,所以这是假设两棵树必须至少有一个相同的问题?对于第 3 部分,我如何知道执行此拆分时项目应位于哪一侧?
  • 如果您没有共同的问题,您可以构建一个带有“未知”分支的三叉树,或者您可以将“未知”与“假”混为一谈——在决定每个分支的哪一侧时类似问题每个项目都属于。
猜你喜欢
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 2023-03-25
  • 2017-08-28
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多