在Java中表示线程注释的最有效的数据结构?

在Java中表示线程注释的最有效的数据结构?,java,data-structures,tree,reddit,threaded-comments,Java,Data Structures,Tree,Reddit,Threaded Comments,我想用Java表示线程化注释。这看起来类似于reddit.com上评论的线程方式 在上面的例子中,响应嵌套在HTML中,带有适当的缩进,以反映它们与先前注释的关系 用Java表示这一点的有效方法是什么 我认为某种树数据结构将是合适的 但是有没有一个特别的方法可以最有效地最小化树遍历 如果我对每一条评论都有投票权,这将非常重要。因为在每次投票后,树需要重新排序,这在计算上可能是一个昂贵的操作 顺便说一句,如果有人知道Java中现有的开源实现,那也会有所帮助 如果我对每一条评论都有投票权,这将非常重

我想用Java表示线程化注释。这看起来类似于reddit.com上评论的线程方式

在上面的例子中,响应嵌套在HTML中,带有适当的缩进,以反映它们与先前注释的关系

用Java表示这一点的有效方法是什么

我认为某种树数据结构将是合适的

但是有没有一个特别的方法可以最有效地最小化树遍历

如果我对每一条评论都有投票权,这将非常重要。因为在每次投票后,树需要重新排序,这在计算上可能是一个昂贵的操作

顺便说一句,如果有人知道Java中现有的开源实现,那也会有所帮助

如果我对每一条评论都有投票权,这将非常重要。因为在每次投票后,树需要重新排序,这在计算上可能是一个昂贵的操作

对我来说,这听起来像是一个过早的优化,甚至可能是一个错误的优化

对于表示数据,您的树数据结构听起来是合乎逻辑的。我说坚持下去。只有在检测到和测量到性能问题,并且可以与备选方案进行比较时,才对其进行优化。

树是正确的(使用getLastSibling和getNextSibling),但如果要存储/查询数据,可能需要通过预排序遍历来存储每个条目的沿袭或编号:

对于丢失确切数量的子节点,可以留出间隙以最大限度地减少重新编号。尽管如此,我不确定这是否会明显快于每次遍历树。我想这取决于你的树长得有多深

另见:


(此方案也称为Celko树)

我将使用链接列表的级别

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

只有当分数更改导致消息大于其上同级或小于其下同级时,才需要重新排序。您不需要在每次分数更改后重新订购。

为什么?当您可以预测性能开销时,尝试从最高效的数据结构开始难道没有意义吗?也许应该这样引用:“过早优化是有害的,但选择愚蠢的数据结构也是有害的”:-[这个词“愚蠢”并不是指Stu或Hula说的任何话,我只想说清楚]。可能是错误的,因为在试用之前,您不知道最有效的数据结构是什么。(很多人尝试优化只是为了让它比简单的代码慢。)在此之前,请使用能够产生清晰可读的代码的结构,这符合你的想法。哇!谢谢你花时间解释这个。我很感激。
message1
    message6
        message7
    message2
        message3
        message4
    message5