【问题标题】:How to represent a binomial tree in memory如何在内存中表示二叉树
【发布时间】:2012-02-18 13:16:29
【问题描述】:

我有这样一个结构,被描述为“二叉树”。来看一张图:

在内存中表示这一点的最佳方式是什么?澄清一下,这不是一棵简单的二叉树,因为节点 N4 既是 N1 的左子节点,也是 N2 的右子节点,N7 和 N8 也发生相同的共享,依此类推……我需要一个易于避免的构造算法复制这些节点,但只是引用它们。

更新 我们中的许多人不同意“二叉树定义”,但这来自金融(特别是衍生品定价),请看这里:例如http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter45.html。所以我使用了“Domain acceted definition”。

【问题讨论】:

  • 那甚至不是一棵树。而实际的binomial tree 看起来不一样。
  • 另外,“最好”是什么意思?你在找什么?代码可读性?内存占用?表现? leftright 引用的简单类型还不够吗?
  • @svick 好吧,我的意思是一种在不复制节点的情况下生成它的方法......
  • 这不是二叉树。它看起来更像是一个deap。
  • @templatetypedef 很好地定义为在某些金融领域:http.developer.nvidia.com/GPUGems2/gpugems2_chapter45.html btw 什么是deap?你的意思是堆?

标签: language-agnostic data-structures


【解决方案1】:

您可以逐级生成结构。在每次迭代中,创建一层节点,将它们放在一个数组中,并将上一层连接到它们。像这样的东西(C#):

Node GenerateStructure(int levels)
{
    Node root = null;

    Node[] previous = null;

    for (int level = 1; level <= levels; level++)
    {
        int count = level;

        var current = new Node[count];

        for (int i = 0; i < count; i++)
            current[i] = new Node();

        if (level == 1)
            root = current[0];

        for (int i = 0; i < count - 1; i++)
        {
            previous[i].Left = current[i];
            previous[i].Right = current[i + 1];
        }

        previous = current;
    }

    return root;
}

整个结构需要O(N^2)内存,其中N是层数。这种方法需要两个数组的 O(N) 额外内存。另一种方法是从左到右生成图形,但这也需要 O(N) 额外的内存。

时间复杂度显然是O(N^2)。

【讨论】:

    【解决方案2】:

    不仅仅是一棵树,我会给它一个定义,比如“N 个顶点和 N-1 条边的连通图”,这个结构看起来像一个 Pascal(或 Tartaglia,如意大利所教)triangle。因此,具有合适索引的数组就足够了。

    施工细节取决于您的数据输入:请提供更多提示。

    【讨论】:

    • 好的,塔尔塔利亚三角形可能是通过根据三角形级别在某个索引中索引节点的方式。
    猜你喜欢
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-01-15
    • 1970-01-01
    • 2011-03-04
    • 2011-08-25
    相关资源
    最近更新 更多