【问题标题】:How to refer to children in a tree with millions of nodes如何引用具有数百万个节点的树中的孩子
【发布时间】:2012-03-10 20:03:08
【问题描述】:

我正在尝试构建一棵树,其中每个节点都可以有未指定数量的子节点。实际上,这棵树将拥有超过一百万个节点。

我已经设法构建了树,但是当我用几千个节点填充树时,由于堆满而出现内存错误。这样做的原因是因为我试图将每个节点的子节点存储在 Dictionary 数据结构(或任何数据结构)中。因此,在运行时,我已经创建了数千个这样的数据结构,因为每个节点都可以有未指定数量的子节点,并且每个节点的子节点都将存储在这个数据结构中。

还有其他方法吗?我不能简单地使用变量来存储子节点的引用,因为每个节点可能有未指定数量的子节点。因此,它不像二叉树,我可以有 2 个变量分别跟踪左孩子和右孩子。

请不要对其他方法提出建议。我有需要创建这棵树的理由,不幸的是我不能这样做。

谢谢!

【问题讨论】:

  • 改用数据库怎么样?您可以使用 SQLite 及其内存支持,然后您只为每个节点存储一个父链接?然后,如果您想查找节点 10 的所有子节点,则必须查询表,说出类似 SELECT * FROM nodes WHERE parent_id = 10 的内容。注意,我不确定这会使用更少的内存,但如果您在几个一千个节点,我猜你为每个节点使用了过多的内存。
  • 您是否考虑过优化节点将包含的数据?这有助于减少内存使用量
  • 问题是我从来没有将树实现为数据库,也不知道从哪里开始。在插入、删除等方面需要进行很多复杂的计算,我无法想象用数据库来实现它。
  • 我知道你说过不要建议任何其他方法,但我无法抗拒!您是否可以只拥有一本字典并用所有对象填充它,然后将子项的键存储在节点中(例如在列表中)?至少只需填充该字典即可显示您是否出于内存原因需要移动到 64 位。
  • "请不要对其他方法提出建议。" ——这似乎很狭隘。您应该专注于以最有效的方式解决问题,而不是以您已经锁定的一种特定方式解决问题。

标签: c# .net data-structures tree nodes


【解决方案1】:

您的节点中有多少是“叶”节点?可能只在您第一次拥有孩子时创建数据结构来存储孩子,否则保持空引用。

除非您需要将孩子作为地图查找,否则我会为孩子使用List<T>(以适当的容量初始化)而不是Dictionary<,>。听起来您的要求可能比您解释的要多,这很难说。

我很惊讶你在仅仅几千个节点之后就失败了——你应该能够在出现问题之前创建大量的对象。

我还建议,如果您认为最终会使用大量内存,请确保您使用的是 64 位计算机,并确保您的应用程序本身设置为 64 位。 (这可能只是对类库的一个薄包装,只要类库设置为 64 位或 AnyCPU 就可以了。)

【讨论】:

  • 我正在使用字典,因为我需要键值对功能。考虑到它正在创建数千个 Dictionary 对象(每个节点一个),应用程序崩溃是否牵强?我原以为这是内存不足异常的原因。
  • @user1261466:说实话,你真的需要展示一些代码并提供更多数据。才几千?不太可能。关键是基于孩子的价值吗?如果是这样,并且您没有非常 多个子节点,您可能只想扫描列表而不是保留Dictionary<,>。同样,了解更多关于您想要实现的目标会很有用。
  • @user1261466:听起来您可能希望为“叶节点”、“有一个孩子的节点”、“有几个孩子的节点”和“有很多孩子的节点”设置不同的对象类型。我仍然怀疑“成千上万”的字典会导致问题。 百万,是的……
猜你喜欢
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2018-03-17
相关资源
最近更新 更多