【问题标题】:How to represent a Pascal-esque (equilateral) triangle in memory如何在内存中表示帕斯卡式(等边)三角形
【发布时间】:2015-09-30 03:34:41
【问题描述】:

我正在研究Project Euler Problem 18(我确实解决了问题;我没有作弊。这里是“Proof”)并且发现自己需要一种表示数据结构的方法这看起来像一个帕斯卡三角形,但具有不同的值。它看起来与二叉树非常相似,但有一个非常重要的区别:节点的子节点不只是它的子节点。所以前三行看起来像这样:

    75
   /  \
  95  64
 /  \ / \
17  47  82

请注意,47 有两个父母。

将其表示为链接结构甚至二维数组非常容易,但我希望有一种更优雅的方式。我喜欢二叉树,主要是因为您可以分配一块内存,将其视为一个数组,并通过几个算术运算或整数除法在子级和父级之间导航。 有没有办法对这个数据结构做同样的事情?

我最好的解决方案是使用二维数组(很容易找到孩子和父母)。我不喜欢这个实现,因为(至少我这样做的方式)我为每一行都调用了malloc,即使我提前知道结构会有多大。

我的问题与this one 非常相似,但我对接受的答案不满意。一条评论暗示了我寻求的解决方案,但没有给出任何解释。

编辑:澄清一下,我正在寻找一种索引一维数组的方法,就像将二叉树按顺序填充到数组中一样(从 1 开始)给出索引 i 处节点的子节点位于索引 2 * i 和 2 * i + 1 的属性..我也不是很在意能不能找到父母,所以不要太担心奇怪的两个父母。

【问题讨论】:

标签: data-structures tree


【解决方案1】:

是的,可以将三角形数据结构存储在一维数组中(Java 中的示例):

class Triangle<T> {
  private T[] triangle;

  public Triangle(T[] array, int rows) {
    if (array.length != triangleNumber(rows)) {
      throw new IllegalArgumentException("Array wrong size");
    }
    triangle = array;
  }

  public T get(int row, int col) {
    return triangle[index(row, col)];
  }

  public void set(int row, int col, T val) {
    triangle[index(row, col)] = val; 
  }

  private int triangleNumber(int rows) {
    return rows * (rows + 1) / 2;
  }

  private int index(int row, int col) {
    if (row < 0 || col < 0 || col > row) {
      throw new IndexOutOfBoundsException("Trying to access outside of triangle");
    }
    return triangleNumber(row) + col;
  }
}

传递给构造函数的数组是通过将三角形的行一一连接到数组中形成的:[t(0,0), t(1,0), t(1,1), t (2,0), t(2,1), t(2,2), ... , t(rows-1, rows-1)],其中 t(R, C) 是三角形行的三角形单元R和三角柱C。

对于任何单元格(行、列):

  • 左孩子将在第+1行,列
  • 右孩子将位于 row+1, col+1
  • 左父级将位于 row-1, col-1
  • 右父级将位于第 1 行,列

并非所有单元格都存在两个父母和两个孩子,因为它们位于三角形之外。查看 index 方法中的异常检查。

【讨论】:

    【解决方案2】:

    是的,有: 我们从二维数组的想法开始,但行长不规则。所以每个元素都由二维索引 (r,c) 进行索引; (1,1) (2,1)(2,2) (3,1)(3,2)(3,3) (4,1)(4,2)(4,3)(4,4)

    因为关系是有规律的,你可以表达我们的立场:
    对于节点 (r,c) 是子节点是 (r+1,min(1,c)),(r+1,max(c+1,r)) 并且他的父节点是: (r-1,min( 1,c-1)),(r-1,max(c,r))

    【讨论】:

    • 谢谢,但我希望摆脱二维数组。请查看我的编辑。
    • @Jay 你的意思是一种只用一个索引来索引的方法?
    • 是的,完全正确。我敢肯定这是一个愚蠢的区别,但我很好奇这是否可能。
    • @jay,是的,但不会像二叉树那样是线性函数
    猜你喜欢
    • 2014-06-10
    • 2011-05-07
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2014-11-12
    • 2015-01-29
    相关资源
    最近更新 更多