DFS算法与树类别中的父子

时间:2018-01-07 13:10:07

标签: algorithm

我需要实现这样的类别树:

laguages
.... Web
........ PHP
........ Python
........ HTML
.... System
........ C
........ C++
........ GO
........ RUST

所以我有一张这样的表:

id | title | parent_id 
1  | system| 0
2  | c     | 1
3  | c++   | 1
4  | rust  | 1
5  | web   | 0
6  | php   | 5
7  | python| 5
8  | html  | 5

如果我想实现树结构,我有两个解决方案。

  1. 使用递归函数创建父子数组

  2. 使用 DFS搜索使我需要添加left和 数据库表中的right列。

  3. 所以我的问题是:这两种解决方案之间有什么区别?哪一个更好?

2 个答案:

答案 0 :(得分:0)

如果搜索操作更频繁,我建议基于数组的方法,因为随机访问的优势。在基于树的结构中,搜索操作往往是 O(高度) ,并且平衡树的最佳高度为 O(log n)< / EM>

相反,如果更新操作更频繁,那么我会采用基于树的方法,因为插入和删除由于移位而在数组中效率不高涉及的元素。

自定义方法

如果您的子阵列WebSystem相当小,那么我的方法就是 adjacency list 数据结构。可以在恒定时间 O(1)中访问WebSystem的列表。在插入和删除的情况下,要删除链接列表克服数组,并且由于列表不是那么长,搜索不会在时间上导致大量问题。

答案 1 :(得分:0)

我认为如果这三种结构并不比你描述的那么多(2级),而不是n级不是一个正确的问题,而是你应该考虑的事情之一。 在php =脚本语言中我们做得很简单(2级的情况):

<?php


$source=Array(' system',Array(' php   ',' c++   ',' html  '),' web   ',Array(' c     ',' rust  ',' python'));
function br(){echo('<br>');}
function printr($ar){
    if(is_array($ar)){
        foreach($ar as $key){
            print('&nbsp;&nbsp;&nbsp;|____'.$key);
            br();
        }
    }else{
        print('['.$ar.']');br();
    }

    return true;
}
array_map("printr", $source);
?>

输出:

&#13;
&#13;
[ system]
   |____ php
   |____ c++
   |____ html
[ web ]
   |____ c
   |____ rust
   |____ python
&#13;
&#13;
&#13;

这个数组:

$source=Array(
' system',
Array(' php   ',' c++   ',' html  '),
' web   ',
Array(' c     ',' rust  ',' python')
);

你应该用&#34;发生器&#34;来获得它。来自表单的输入,来自使用另一个生成器(web,编译器)创建的内部文件......

当完美输入优化存储在智能结构中时,可以避免使用大量计算,迭代(DFS算法或亲子或任何其他方法),从而获得最大结果

&#13;
&#13;
/*
Also using of serialize
functions you can store an entirely array,
unserialize will help you to restore your array
*/


$source=unserialize($from_a_table_1_row_forever);
//   $from_a_table_1_row_forever=obtained from some your function to read it from a database,file ...etc
//now is good to use in memory,i mean that multi array


//when you want to store changes in some generator:
$for_a_table_1_row_forever=serialize($source);
good_to_write_it_in_a_single_table_row($for_a_table_1_row_forever);
//   (some your function to write in a database,file ...etc)
&#13;
&#13;
&#13;