合并两个未排序和不合格的树

时间:2011-12-14 11:07:30

标签: c tree

是的,我正在学习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. 你如何循环到每个节点的底部并将其与另一个树进行比较?
  4. 我最好的主意:

    1. 在第二个树中搜索第一个树中的对象
    2. 用穿山甲对象替换这些对象
    3. 在第一个
    4. 中查找所有出现的穿山甲
    5. 将父项指向第二个树的顶部,而不是
    6. 但是这打破了树的结构,并且可能使游戏中断(比如第一棵树中的顶部问题是红色),第二棵树附着在no节点上,第二棵树中的所有项目都是红色的?

      我的主要问题:

      • 您是否知道如何解决这个问题?还是一个有点工作的黑客?
      • 你怎么在两棵树上找到重复的东西?
      • 你如何将树木连在一起?
      • 你如何在每棵树的底部循环?

1 个答案:

答案 0 :(得分:3)

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

  1. 考虑所有项目。
  2. 创建新节点。
  3. 对于节点,选择区分当前项目集中大多数项目的问题:
    • 请注意,问题区分的项目数是问题发生的每个树中问题下方所有项目的总和。
  4. 根据问题拆分项目集。
  5. 对于两个新集合中的每一个,从步骤2递归重复。
  6. 当谈到逻辑相同但语言不同的问题时......这是一个非常困难的自然语言问题。如果不进行任何语言分析,您可以做一些简单的事情,比如忽略大小写,标点符号和间距的问题字符串。