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来保存属性.然后有非常复杂的算法来处理那些缓存到期.这非常令人费解,我想重构一个更清洁的解决方案/数据结构.
有人有什么想法吗?
谢谢!
我假设您希望节省所有这些可继承属性(或者您可能有很多)的内存,否则可以使用虚拟属性轻松解决这个问题。
如果您需要稀疏的可继承属性,例如您正在对 HTML DOM 属性或 CSS 属性的传播方式进行建模,则需要:
当然,您可以在此基础上添加更多功能。这类似于 Windows Presentation Foundation 通过 DependencyProperty 解决此问题的方式。
相反,如果您的问题是避免读取数据库来遍历树(即加载父级以查找继承的属性),则您需要对父级值进行某种缓存。或者,当您从数据库加载叶子时,您可以加载其所有父级并在内存中创建主合并属性字典。
如果您想避免多次数据库查找来查找每个父节点,一个技巧是将每个节点的路径编码到文本字段中,例如,第 6 层的叶子为“1.2.1.3.4”。然后,仅加载具有开始子字符串的路径的节点。然后,您可以在一个 SQL 查询中获取整个父路径。