【问题标题】:Implementing a common attribute in recursive data type like TREE在递归数据类型(如 TREE)中实现公共属性
【发布时间】:2021-05-28 19:55:35
【问题描述】:

在实现像 TREE 这样的递归数据结构时,我需要每个 TREE 都有一个公共属性,我想知道如何实现它:

  • 将属性添加到树节点,复制每个节点的属性,而不是每个树一次
  • 使用once 属性,我只获得所有棵树的一个共享属性,而不是每棵树一个。

有什么优雅的埃菲尔风格的解决方案吗?

【问题讨论】:

  • 这取决于树结构。例如,是否有可能从树的任何其他节点到达根节点?如果是,则根节点可以是具有所需属性的特殊节点,所有其他节点都可以在需要时通过访问根节点来检索该属性值。
  • 在一般树中您无法到达根节点,但在一种实现中您实际上可以。那么当根节点可以从任何节点访问时(可能通过名为parent 的属性),您能否草拟一个部分答案。

标签: recursion data-structures attributes eiffel


【解决方案1】:

一棵树有一个可区分的节点,该节点可用于存储与整棵树相关的信息,而不是与特定节点相关的信息。为了检索此信息,应该有可能从树的任何其他节点到达根节点。一种可能的解决方案是拥有一个功能parent,它将返回指定节点的父节点(或Current 为根)。那么,得到根节点的特征可以是这样的

root: TREE
        -- The root of the tree.
    local
        p: TREE
    do
        from
            Result := Current
            p := parent
        until
            Result = p -- `Result = Result.parent` when `Result` is root.
        loop
            Result := p
            p := p. parent
        end
    ensure
        Result.parent = Result -- `Result` has no other parent.
    end

然后可以从任意树节点nn.root.my_attribute 检索树特定属性值。

编辑:

另一种可能性是有一个专用的CELL 来存放所需的数据,树中的所有节点都只是引用这个单元格。好处是不需要对父节点的引用,并且可以立即访问数据。

【讨论】:

  • 所以nTREE,而my-attributeTREE 的一部分?如果是这样,那么my_attribute 是否不存在于任何TREE 节点中?如果是这样,那将不是一个答案(效率问题放在一边)。
  • @U.Windl 不同的实现是可能的。一方面,树中的所有节点都具有相同的类型,属性存在于每个节点中,但是,n.root.my_attribute 保证只使用一个版本。在另一个实现中,根具有专用类型。每个节点都将my_attribute 实现为返回root.my_attribute 的函数,但根节点除外,它是实际属性。
  • 即使有once 属性(这不会​​解决问题)我担心TREE 的每个节点都会包含一个POINTER 对应于once 函数。具体来说,我想到的是一个位(BOOLEAN)。在 C 中(作为对比),可以使用位字段,很可能无论如何都有一些备用位(例如树平衡)。
  • @U.Windl 这个问题与语言无关,请随时用任何语言提供有效的答案。
  • 实际上我正在考虑基于数组的实现,让这样的事情变得更容易。
猜你喜欢
  • 2020-05-22
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多