13

这是一个理论/迂腐的问题:想象一下每个可以由多个其他人拥有的属性。此外,从所有权的一次迭代到下一次,两个相邻的所有者可以决定部分合并所有权。例如:

territory 1, t=0: a,b,c,d
territory 2, t=0: e,f,g,h

territory 1, t=1: a,b,g,h
territory 2, t=1: g,h

也就是说,c不再d拥有财产;并且变成了肥猫,可以这么说gh

我目前将此数据结构表示为一棵树,其中每个孩子都可以有多个父母。我的目标是把它塞进复合设计模式中;但我在获得关于客户如何返回并更新以前的所有权而不破坏整个结构的概念基础上遇到问题。

我的问题是双重的。

  1. 简单:这个数据结构的方便名称是什么,以便我可以自己搜索它?

  2. 硬:我做错了什么?当我编写代码时,我试图在脑海中保持“保持简单,愚蠢”的口头禅,我觉得我正在打破这个信条。

4

3 回答 3

14

我的问题有两个: 简单:这个数据结构的方便名称是什么,以便我可以自己搜索它?

你在这里拥有的不是一棵树,而是一个图表。多图将在这里为您提供帮助。但是任何邻接表或邻接矩阵都会给你一个好的开始。

这是关于邻接矩阵和列表的视频:Youtube on adjacency matrix and list

硬:我做错了什么?

这真的很难说。也许您没有以适当的方式对关系进行建模。考虑到一个好的数据结构,这并不难。

而且,当您询问设计模式时(但您可能自己发现了),复合模式可以让您轻松地为这样的设置建模。

于 2012-07-19T06:02:40.963 回答
3

您的所有者和您的区域(属性)之间存在多对多的关系。我不确定您使用的是哪种语言,但这种事情可以很容易地在关系数据库中表示和跟踪。(您可能需要为每个实体创建一个表,并且该关系可能需要第三个“联结”表。如果需要能够查询“及时”,这可能有某种“时间索引”列也一样。)

如果您使用面向对象的语言,您可能会创建两个类,即 Territory 和 Owner,其中 Territory 类有一个属性/成员/字段,它是指向 Owners 的引用/指针的集合,而 Owner 类有一个类似的集合的领土。(这两个集合之一可能需要包含“弱”引用,具体取决于语言。)

在这种情况下,如果您希望能够返回并查看较早某个特定时间点的网络状态,则可能会出现一些困难。(如果这是您需要的,请说出来,我(或其他人)可以发布适用于此的解决方案。)

我不确定您要追求的简单程度,但在这两种情况下,更新所有权关系都不是那么“难”。也许如果您发布了一些代码,可能会更容易为您提供更具体的建议。

于 2012-07-19T05:41:52.050 回答
0

如果没有有关业务规则的更多信息,很难说。尽管我在设计每个节点可能有许多父节点的图表方面有丰富的经验。

一个常见的结构是有向无环图。这里的基本规则是,通过图形的任何路径都不能循环回到自身。例如采用 path "A/B/C/B",这将是无效的,因为 B 重复了两次。

  1. 有效:- "A/B/C", "D/E/C", 节点C有两个父节点EB.
  2. 无效:- "A/B/C/B",节点B在同一路径中重复导致循环。
于 2021-08-23T18:12:54.603 回答