树型论坛的快速算法

原创 2001年10月09日 14:41:00

树型论坛的快速算法
左轻侯
2001.10.9

 树型论坛(即阶梯式论坛)的实现算法,是一直被讨论的问题。总结起来,一般无非是两种:第一是递归。这种方式最简单,思路最清楚,但是效率也最低,特别是进行页定位的时候。由于每进行一次递归调用,就必须执行一条数据库查询,使它在大量并发请求时的负载成为灾难性的。因此这种算法一般不实用。第二是增加一个排序字段,思路是使用一个特殊设计的字段,例如排序串或者中值排序基数,来实现贴子的插入,在显示的时候,只需要为每一个主贴执行一次查询,将所有得到的记录按序显示即可。这种方式在效率上有了很大提高,但是仍然不很理想,而且使得插入的代码增加了不必要的复杂性,同时还往往导致了支持层次有限制的问题。
 有没有一种办法可以简单、高效地实现树型论坛呢?我想到了一种算法,在显示速度上应该超过我见的任何类似算法,实现起来也不复杂。
 思路很简单:就是完全不理会树型结构本身,将整个论坛视为一个简单的顺序表。这样不论任何形式的页面,只需要一条查询即可得到。那么如何实现树型结构呢?方法是添加两个格式化字段,一个记录顺序表的次序,一个记录树的层次,对取得的记录集进行相应格式化,即可得到原汁原味的树型论坛。
 具体实现方法如下:
1、数据库结构。只列出必需的字段,全部为int型:
id:贴子序号
ordernum:排序字段,按照显示顺序从大到小,最早的一条贴子为1
levelnum:树的层次,0为主贴,以此类推 
2、显示。使用一条语句:“select * from article order by ordernum DESC”,得到需要的记录集。遍历记录集,检查它的levelnum字段,设置相应的缩进。为0则是主贴,不缩进,为1则缩进一层,以此类推,然后显示之。
3、插入。关键是如何设置ordernum字段。分为两种情况:
一是发新的主贴,相当于在顺序表的最后添加一条记录。这样最简单,只需要通过查询,得到max(ordernum),然后将ordernum字段设置为该值加1即可。
二是跟贴,相当于在顺序表的中间插入一条记录。方法是,先得到插入点的ID(即跟贴的父贴ID),将该贴的ordernum值赋予新贴,然后将所有插入点之前(包括插入点本身)的记录的ordernum全部加1,等于让它们在顺序表中往后移一位,腾出位置。举例来说:要在一个ID为23的贴子之后跟贴,首先select得到ID23的ordernum,假设为18,将其赋予新贴的ordernum;然后执行“update article set ordernum = ordernum + 1 where ordernum >= 18”,将新贴之后的贴子全部后移。
 效率分析:
 显示速度应该不会更快了,仅仅是一条简单的select,对一个int字段进行排序,而且支持无限的回复层次。相比之下,递归需要为一个页面中的每一条贴子进行一次select,对datetime字段进行排序,而“主贴排序字段法”需要为每一个主贴进行一次select,对char字段进行排序。
 最大的问题在于插入时,如果插入的位置很靠前,可能要更新大量记录的ordernum字段。但是经验告诉我们,这种树型论坛,回复一般都集中在第一二页,极少有人回复很久以前的贴子,所以偶尔为之,也不会增加太大的负担。如果你实在不放心,也可以用技术手段强制禁止回复一段时间之前的贴子。
 本论坛的实现见“Delphi开发者资源社区”(http://delphi.mychangshu.com)的附属论坛,全部源代码提供下载,基于ASP+ACCESS。

树型论坛的数据库设计和快速算法

树型论坛(即阶梯式论坛)的实现算法,是一直被讨论的问题。总结起来,一般无非是两种: 第一是递归。这种方式最简单,思路最清楚,但是效率也最低,特别是进行页定位的时候。由于每进行一次递归调用,就必须执行一...
  • zty_nit
  • zty_nit
  • 2006年04月09日 15:38
  • 851

树型论坛的数据库设计和快速算法

 树型论坛(即阶梯式论坛)的实现算法,是一直被讨论的问题。总结起来,一般无非是两种:   第一是递归。这种方式最简单,思路最清楚,但是效率也最低,特别是进行页定位的时候。由于每进行一次递归调用,就必须...
  • wangxiaobo23
  • wangxiaobo23
  • 2006年09月12日 17:35
  • 916

近期完成了PHPWIND的树形论坛改版(PHPWIND的树型论坛结构)

近期完成了PHPWIND的树形论坛改版(PHPWIND的树型论坛结构)大家有什么好的建议,希望和大家一起研究QQ:372900288...
  • dotfun
  • dotfun
  • 2008年07月17日 13:08
  • 5730

物联12:二进制树型搜索算法实例

二进制树型搜索算法实例       这里以范围内的四个电子标签为例说明搜索的过程。这四个电子标签的序列号分别为:      电子标签1:   10110010      电子标签2:   101000...
  • u013847155
  • u013847155
  • 2015年04月15日 11:00
  • 2029

RFID系统二进制树型搜索算法解决碰撞的方法及简要步骤

将处于冲突的标签分成左右两个子集0和1,先查询子集0,若没有冲突,则正确识别标签,若仍有冲突则再分裂,把子集0分成00和01两个子集,依次类推,直到识别出子集0中所有标签,再按此步骤查询子集1。 ...
  • u013038590
  • u013038590
  • 2015年04月19日 11:16
  • 1861

路由之路由表查找算法概述-哈希/LC-Trie树/256-way-mtrie树

转自:http://blog.csdn.net/dog250/article/details/6596046 引:路由是互联网的一个核心概念,广义的讲,它使分组交换网的每个节点彼此独立,通过路由耦合...
  • dalskjflaskjd
  • dalskjflaskjd
  • 2014年03月24日 22:10
  • 3146

【LB】稀疏矩阵的快速转置原理及其算法

关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置。如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了!          对于一个三元表,行为i,列为...
  • u013598542
  • u013598542
  • 2014年04月14日 22:30
  • 7396

快速立即除法的乘法实现(通用算法)

快速立即除法的乘法实现(通用算法)原创:HAM这里我们要讲的是如何使用整数乘法来完成除数为常数的整数除法运算,我们假定都是无符号操作,并且运算在Intel 32bit x86 CPU上。在整数除法操作...
  • concreteHAM
  • concreteHAM
  • 2009年10月31日 10:46
  • 3416

map的树型算法

数据源:   关于n年中某考试申请,通过未发证,发证的统计;   申请表:申请时间,籍贯省,籍贯市,申请人类型 ,申请数,申请人编号 ;       申请人类型有两种 A和B   通过未发证:审核时间...
  • ft0905
  • ft0905
  • 2007年06月10日 15:02
  • 542

快速开平方根算法

人们很早就在Quake3源代码中发现了类似如下的C代码,它可以快速的求1/sqrt(x),在3D图形向量计算方面应用很广 float invSqrt(float x) { float xhalf...
  • xtlisk
  • xtlisk
  • 2016年04月26日 12:02
  • 7114
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树型论坛的快速算法
举报原因:
原因补充:

(最多只允许输入30个字)