RSS
 

Archive for December 9th, 2010

预排序遍历树算法的探究(无限级分类算法)-1

09 Dec

今天在自己做分类的时候也碰到这个经典问题,我之前通常都是通过DictName和DictType做2级分类的,或者是通过parentId做递归查询,的确有时候在应用范围和递归效率上面另两难的选择。这次通过网络找到一个比较好的非递归算法,但是由于其局限性,牺牲了写的性能而强化了读的效率,正好跟递归反一反。为此我顺水推舟,准备将2者整合,形成一个比较完善的算法来处理。当然,既然不牺牲读写速度了,那势必得牺牲存储空间了,呵呵,广大同学服务器的空间还是能适应这点存储要求的吧。

首先作为开篇,我们来看一下网上的这篇帖子,主要算法思想原来是源自MySQL官方文档Managing Hierarchical Data in MySQL

多层数据结构估计所有的web开发者估计都不会陌生,各种软件的分类都是基于多层结构来设计的。

下面是一个典型的多层数据结构示意图:

相关创建数据语句:

CREATE TABLE category(
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
parent INT DEFAULT NULL);

INSERT INTO category
VALUES(1,'ELECTRONICS',NULL),(2,'TELEVISIONS',1),(3,'TUBE',2),
(4,'LCD',2),(5,'PLASMA',2),(6,'PORTABLE ELECTRONICS',1),
(7,'MP3 PLAYERS',6),(8,'FLASH',7),
(9,'CD PLAYERS',6),(10,'2 WAY RADIOS',6);

SELECT * FROM category ORDER BY category_id;

在这种数据结构中,各层之间通过字段 parent 来形成邻接表,我们查询某些层级的关系的时候一般都是通过递归的方式,遍历某个层级关系的SQL的查询次数会顺着层级的增加,想想在层级有20的时候,根据某个底层节点取它到顶层节点的查询次数吧。 Read the rest of this entry »