无限级目录树最优算法的新研究
表结构:id pid nodepath nodetype
1 0 0> F
2 0 0> D
3 2 0>2> D
4 3 0>2>3> F
测试项目:
1。获取当前节点的父节点:方法a,直接搜pid;方法b,在nodepath中匹配。 复杂度:O(n)
2。获取当前节点的下级子节点: 复杂度:O(n)
3。获取当前节点的所有子孙节点: 复杂度:O(n)
4。获取当前节点的所有直系祖宗节点: 复杂度:O(n)
根据nodetype,画树的时候不必再搜索数据库去判断该节点是否还有子节点。
本数据结构支持无限级树,该结构在web中应用是最优算法。
2.数据库的规划
------------------------------------------------------------
前面谈到分类的复杂性,因此如何规划数据库便成为了实现无限分类非常重要的一步.
我曾介绍过论坛的数据库规划,不错论坛能够实现无限的跟接,无限分类便是这种形式的扩展,分类同样是这种子父的关联关系,所以分类的数据库就是如何确立明确这种子父关系,这里面有几个难点.
1)如何处理各分类的信息存储;
2)如何处理分类的亲缘关系;
3)如何处理对信息的查询;
亲缘关系的数据库处理与论坛的数据库处理类似,这里建个 type 的数据库用来处理分类:
建立字段:
id(int):用来记录各分类的自然序号
uid(int):用来记录该分类的父分类的 id 号
type(char):类别的名称
roue_id(varchar):亲缘树,以 :0:2:10:20: 的 id 连接表明亲源关系
roue_char(varchar):亲缘树,类似 :系统:linux:开发工具:gcc: (这个字段有没有都没关系,为了更方便地了解各亲缘关系当然字符表述比数字表述更直接^o^,不过最好加上这个字段)
这样一个无限分类的类别表就建立了起来,接下来就需要建立存储信息的数据库,处理查询一个表最方便所以这里建立一个表存储信息 type_message:
id(int):信息的序号;
typeid(int):所属类别的 id 号;
title(varchar):信息标题;
message(text):信息内容;
time:信息建立的时间;
这两个数据表就能够完成无限分类的这个任务了(两个表的辅助字段就没加了,读者可自行加入).
剩下的任务就全部交由 php 来处理完成.