用于替换三个嵌套循环的适当算法 - 嵌套注释

时间:2014-03-13 14:57:36

标签: php algorithm tree

所以我正在编写一个带有嵌套回复的评论系统。我已经将存储和检索部分关闭了,最后得到了一个注释对象数组,每个注释对象都有一个回复属性,它本身就是一个注释对象数组。

允许的最大深度为3 - 或回复回复。

我正在寻找一个适当有效的替代三个嵌套循环来显示注释,或循环遍历顶层,然后循环遍历他们的回复,然后循环遍历他们的回复,因为这是不可扩展的。

好的,所以我被要求提供一些代码:

class Comment{
    public $replies = array();
    public $content;
}

因此注释对象包含一个回复数组,这些回复本身就是注释对象。这有三层深,所以我有一个顶级注释数组,每个注释都包含一个回复数组,每个回复都包含一个回复数组。

我想找到一个优于此的解决方案,因为它出现在O(n ^ 3)我相信:

foreach($comments as $c){
    //do some stuff to display the comment here
    foreach($c->replies as $r){
        //do some stuff to display the replies here
        foreach($r->replies as $rr){
            //do some stuff to display replies to replies here
        }
    }
}

1 个答案:

答案 0 :(得分:2)

首先,您的代码的运行时间不是O(n^3),而是O(total number of replies),因为它将遍历所有回复一次(循环不是从{{1}运行} 1,它们是foreach循环,它们执行的迭代次数取决于数组的大小。)

执行此任务没有更好的运行时间,因为您希望对每个回复执行某些操作,因此此任务的下限为n

我会做的是重写代码并使用递归函数,因为您的代码对更改不是很灵活,如果有一天您决定允许4个级别的回复,那么您将会这样做必须重写这段代码,而如果你使用递归,你就不会。

就像我说的那样,预计不会提高性能,而只是一种更好的做法。