在基于树的结构中继承属性的最佳方法是什么?

chu*_*boy 7 algorithm tree data-structures

我有一个简单的CMS系统,它有一个简单的树层次结构:

我们的页面A到E具有以下层次结构:A - > B - > C - > D - > E.

所有页面都是同一个类,并且具有父子关系.

现在,假设我有一个我希望在页面中继承的属性.假设A为红色:A(红色) - > B - > C - > D - > E.

在这种情况下,B到E将继承"红色".

或者更复杂的场景:A(红色) - > B - > C(蓝色) - > D - > E.

B会继承红色,而D/E都是蓝色的.

什么是解决这类问题的最佳方法?我有一个树形结构,有超过6,000片叶子,其中约有100片叶子具有遗传特性.那些100左右的叶子的属性保存在数据库中.对于没有显式属性的叶子,我查找祖先并使用memcached来保存属性.然后有非常复杂的算法来处理那些缓存到期.这非常令人费解,我想重构一个更清洁的解决方案/数据结构.

有人有什么想法吗?

谢谢!

Ste*_*ung 2

如果您的问题与性能相关......

我假设您希望节省所有这些可继承属性(或者您可能有很多的内存,否则可以使用虚拟属性轻松解决这个问题。

如果您需要稀疏的可继承属性,例如您正在对 HTML DOM 属性或 CSS 属性的传播方式进行建模,则需要:

  1. 保留指向父节点的指针(用于向上行走)
  2. 使用哈希字典存储每个类(或每个实例,取决于您的需要)内的属性,按名称键控
  3. 如果属性不因实例而异,请使用类静态字典
  4. 如果属性可以逐个实例覆盖,请在顶部添加实例字典
  5. 访问属性时,从叶子开始查找,首先查找实例字典,然后查找类静态字典,然后沿着树向上查找

当然,您可以在此基础上添加更多功能。这类似于 Windows Presentation Foundation 通过 DependencyProperty 解决此问题的方式。

如果您的问题与数据库相关......

相反,如果您的问题是避免读取数据库来遍历树(即加载父级以查找继承的属性),则您需要对父级值进行某种缓存。或者,当您从数据库加载叶子时,您可以加载其所有父级并在内存中创建主合并属性字典。

如果您想避免多次数据库查找来查找每个父节点,一个技巧是将每个节点的路径编码到文本字段中,例如,第 6 层的叶子为“1.2.1.3.4”。然后,仅加载具有开始子字符串的路径的节点。然后,您可以在一个 SQL 查询中获取整个父路径。