【问题标题】:Memory allocation for a tree and its subtree树及其子树的内存分配
【发布时间】:2015-05-31 18:55:18
【问题描述】:

在linux系统中。

如果我有两棵二叉树,树 A 有数百万个节点,而树 B 只有几百个节点。

我想检查 B 是否是 A 的子树。

我正在考虑的一个解决方案是,例如,A 使用 50Mb 的内存,地址是连续的,而 B 使用 1Kb。如果 B 是 A 的一部分,则 B 的地址将是 A 地址的子集(我猜?)。

那么我可以使用树 A 的内存地址范围和 B 的内存地址范围来判断 B 是否是 A 的子树吗?

更新: 我想如果我们使用静态内存分配,并且有一个节点指向与 B 的根相同的指针,可能当我们找到该节点时,我们可以确定 B 是 A 的子树。

【问题讨论】:

  • 我不明白这个问题。也许需要澄清一下。
  • @user3344003刚刚修改,如果对你还有歧义请告诉我:p
  • A和B是否在单个进程的地址空间中?
  • @user3344003 如果他们在不同的进程中,那么我认为没有必要做这个检查?所以让我们假设他们在同一个过程中。
  • 假设这些树的内容的内存地址是不安全的。内存分配器提供的每个节点都可能来自任何地方,例如之前从其他地方删除的内存位。我认为你需要走树 A 寻找 B,然后一旦找到它,就同步走两棵树,并确认 B 中的每个孩子在 A 中都有相同的孩子。

标签: memory tree binary-tree memory-address


【解决方案1】:

您不能使用 AB 的内存地址来检查 AB 的相等性.

另一种方法是生成 B 树的散列。然后对A进行深度优先遍历,生成A的子树的hash。如果 A 的子树的哈希与 B 的哈希匹配,则验证 B 是否与特定的 A 匹配子树。

请参阅this 从树中生成哈希。

【讨论】:

  • 从来没有想过生成哈希,好主意!谢谢!
  • 如果我的回答有帮助,请点赞和/或接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2013-04-14
  • 2014-09-06
  • 2017-12-03
  • 2013-05-14
相关资源
最近更新 更多