[英]Most efficient data structure to represent threaded comments in Java?
我想用Java表示线程注释 。 这看起来与reddit.com上的注释的方式类似
hello
hello
hello
hello
hello
hello
hello
如上例所示,响应嵌套在HTML中,并带有适当的缩进,以反映它们与先前注释的关系。
用Java表示这个的有效方法是什么?
我认为某种树数据结构是合适的。
但有没有一个特别是最有效的最小化树遍历?
如果我对每条评论进行投票,这将非常重要。 因为在每次投票之后树需要重新排序 - 计算上可能是昂贵的操作。
顺便说一下,如果有人知道Java中的这个开源现有实现,那也会有所帮助。
我会使用链接列表的级别。
message1
message2
message3
message4
message5
message6
message7
每个节点都有一个指向它的指针:
- forward sibling (2->5, 3->4, 5->6, 1/4/6/7->NULL).
- backward sibling (4->3, 5->2, 6->5, 1/2/3/7->NULL).
- first child (1->2, 2->3, 6->7, 3/4/5/7->NULL).
- parent (2->1, 3->2, 4->2, 5->1, 6->1, 7->6, 1->NULL).
在每个级别中,消息将按照投票计数(或您想要使用的任何其他分数)在列表中进行排序。
这将为您提供最大的移动灵活性,您可以通过更改父级和该级别的链接来移动整个子树(例如, message2
)。
例如,假设message6
获得大量投票,使其比message5
更受欢迎。 更改是(调整下一个和上一个兄弟指针):
message2 -> message6
message6 -> message5
message5 -> NULL
。 要得到:
message1
message2
message3
message4
message6
message7
message5
如果继续,直到它加纳斯更多的选票比message2
,出现以下情况:
message6 -> message2
message2 -> message5
和第一子指针message1
设置为message6
(这是message2
),还比较容易,可以得到:
message1
message6
message7
message2
message3
message4
message5
只有当分数变化导致消息变得超过其上层兄弟或低于其下级兄弟时,才需要重新排序。 每次分数变更后,您无需重新订购。
树是正确的(使用getLastSibling和getNextSibling),但是如果您正在存储/查询数据,您可能希望为每个条目存储一个谱系,或者通过前序遍历来存储数字:
http://www.sitepoint.com/article/hierarchical-data-database/2/
如果丢失了确切的子节点数,您可以留下间隙以最小化重新编号。 尽管如此,我不确定这会明显快于每次遍历树。 我想这取决于你的树有多深。
也可以看看:
SQL - 如何存储和导航层次结构? http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html (此方案也称为Celko树)
如果我对每条评论进行投票,这将非常重要。 因为在每次投票之后树需要重新排序 - 计算上可能是昂贵的操作。
听起来像是对我的过早优化,甚至可能是错误的优化。
您的树数据结构听起来很合理,可用于表示数据。 我说坚持下去。 只有在检测到并测量到性能问题时才能对其进行优化,并且可以与备选方案进行比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.