我需要实现这样的类别树:
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
如果我想实现树结构,我有两个解决方案。
使用递归函数创建父子数组
使用
DFS搜索使我需要添加left
和
数据库表中的right
列。
所以我的问题是:这两种解决方案之间有什么区别?哪一个更好?
答案 0 :(得分:0)
如果搜索操作更频繁,我建议基于数组的方法,因为随机访问的优势。在基于树的结构中,搜索操作往往是 O(高度) ,并且平衡树的最佳高度为 O(log n)< / EM> 强>
相反,如果更新操作更频繁,那么我会采用基于树的方法,因为插入和删除由于移位而在数组中效率不高涉及的元素。
自定义方法
如果您的子阵列Web
或System
相当小,那么我的方法就是 adjacency list 数据结构。可以在恒定时间 O(1)中访问Web
或System
的列表。在插入和删除的情况下,要删除链接列表克服数组,并且由于列表不是那么长,搜索不会在时间上导致大量问题。
答案 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(' |____'.$key);
br();
}
}else{
print('['.$ar.']');br();
}
return true;
}
array_map("printr", $source);
?>
输出:
[ system]
|____ php
|____ c++
|____ html
[ web ]
|____ c
|____ rust
|____ python
&#13;
这个数组:
$source=Array(
' system',
Array(' php ',' c++ ',' html '),
' web ',
Array(' c ',' rust ',' python')
);
你应该用&#34;发生器&#34;来获得它。来自表单的输入,来自使用另一个生成器(web,编译器)创建的内部文件......
当完美输入优化存储在智能结构中时,可以避免使用大量计算,迭代(DFS算法或亲子或任何其他方法),从而获得最大结果
/*
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;