登录名:  密码:  验证码: 2678
设为首页 收藏本站 联系站长
2009年1月10日
农历戊子年(鼠)
腊月十五
 首页 | 最新上传 | 新闻 | 购物商场 | 招聘求职 | HTML学习 | java学习 | IT新闻 | 黑客技术 | 域名和空间 | 流量统计 | 故事小说
 GIF动画制作 | 图片素材 | 源码下载 | 书籍下载 | 视频资料 | ASP | 数据库 | PHP | 基本电脑知识 | 迅雷资源 | 兼职 | 组网工程
 英语学习 | FLASH专区 | ASP.NET | VB | 综合资源网 | 驱动下载 | 游戏下载 | 网站模板网页美工 | 韩文学习 | 论坛
 特别推荐:产品报价  漂亮网站网址  图片素材
  我要查找:  
欢迎您来这里。每天学一点,每天进步一点!
Google
 当前位置:首页 >> ASP  >> ASP
整理一个asp多级树型分类问题的解决方法
来源:  发表日期:2008年4月5日 作者: 

 编辑:admin 级别: 司令 浏览次数:600
】    

  
strSQL  =  "select  top  100  *  from  Product  where  FatherID  in  ("&GetAllID(oConn,FID)&")" 
set  rsProduct=oConn.Execute(strSQL) 
%> 
<UL><% 
Do  while  not  rsProduct.EOF 
%> 
 <LI><%=rsProduct("Name")%> 
<%   
Loop 
%> 
</UL> 
<%rsProduct.Close 
oConn.Close   
%>

这个算法有很多缺点。试列举几个如下:

1、由于我们需要查询FID下的所有分类,当分类非常多时,算法将非常地不经济,而且,由于要构造一个很大的strSQL,试想如果有1000个分类,这个strSQL将很大,能否执行就是一个问题。

2、我们知道,在SQL中使用In子句的效率是非常低的。这个算法不可避免地要使用In子句,效率很低。

我发现80%以上的程序员钟爱这样的算法,并在很多系统中大量地使用。细心的程序员会发现他们写出了很慢的程序,但苦于找不到原因。他们反复地检查SQL的执行效率,提高机器的档次,但效率的增加很少。

最根本的问题就出在这个算法本身。算法定了,能够再优化的机会就不多了。我们下面来介绍一种算法,效率将是上面算法的10倍以上。 

分类编码算法

问题就出在前面我们采用了顺序编码,这是一种最简单的编码方法。大家知道,简单并不意味着效率。实际上,编码科学是程序员必修的课程。下面,我们通过设计一种编码算法,使分类的编号ID中同时包含了其父类的信息。一个五级分类的例子如下:
 
此例中,用32(4+7+7+7+7)位整数来编码,其中,第一级分类有4位,可以表达16种分类。第二级到第五级分类分别有7位,可以表达128个子分类。
显然,如果我们得到一个编码为  1092787200  的分类,我们就知道:由于其编码为
 0100  0001001  0001010  0111000  0000000
所 以它是第四级分类。其父类的二进制编码是0100  0001001  0001010  0000000  0000000,十进制编号为1092780032。依次我们还可以知道,其父类的父类编码是0100  0001001  0000000  0000000  0000000,其父类的父类的父类编码是0100  0000000  0000000  0000000  0000000。(我是不是太罗嗦了:,但这一点很重要。再回头看看我们前面提到的第五个问题。哈哈,这不就已经得到了分类1092787200所在的 分类路径了吗?)。
现在我们在一般的情况下来讨论类别编码问题。设类别的层次为k,第i层的编码位数为Ni,  那么总的编码位数为N(N1+N2+..+Nk)。我们就得到任何一个类别的编码形式如下:
2^(N-(N1+N2+…+Ni))*j  +  父类编码
其中,i表示第i层,j表示当前层的第j个分类。

这样我们就把任何分类的编码分成了两个部分,其中一部分是它的层编码,一部分是它的父类编码。由下面公式定一的k个编码我们称为特征码:(因为i可以取k个值,所以有k个)
2^N-2^(N-(N1+N2+…+Ni))

对于任何给定的类别ID,如果我们把ID和k个特征码"相与",得到的非0编码,就是其所有父类的编码!

位编码算法

对任何顺序编码的Catalog表,我们可以设计一个位编码算法,将所有的类别编码规格化为位编码。在具体实现时,我们先创建一个临时表:

Create  TempCatalog(
 [OldID]  [int]  NOT  NULL,
 [NewID]  [int]  NOT  NULL,
 [OldFatherID]  [int]  NOT  NULL,
 [NewFatherID]  [int]  NOT  NULL
);

在这个表中,我们保留所有原来的类别编号OldID和其父类编号OldFatherID,以及重新计算的满足位编码要求的相应编号NewID、NewFatherID。
程序如下:


<% 
REM  oConn---数据库连接,已经打开 
REM  OldFather---原来的父类编号 
REM  NewFather---新的父类编号 
REM  N---编码总位数 
REM  Ni--每一级的编码位数数组 
REM  Level--当前的级数 
  
sub  FormatAllID(oConn,OldFather,NewFather,N,Nm,Ni  byref,Level) 
 strSQL  =  "select  CatalogID  ,  FatherID  from  Catalog  where  FatherID="  &  OldFather 
 set  rsCatalog=oConn.Execute(  strSQL  ) 
  
 j  =  1 
 do  while  not  rsCatalog.EOF 
   i  =  2  ^(N  -  Nm)  *  j 

分页: [1] [2] [3] [4] [5] [6] [7] [8] [9]
(编辑:网站学习网)
Google
 ·上一篇文章: 屏幕保护程序下载
 ·下一篇文章: 局域网内打印机共享设置
 该篇文章的评论
 暂无相关评论
 姓名:  邮箱:
 内容:
                
 相关文章
 · Microsoft VBScript 运行
 · 整理一个asp多级树型分类
 · DW网页设计100例94:在线
 · 如何实现添加到收藏夹
 · ASP源码下载
 · ASP多媒体视频教程专区
 · MM_preloadImages()问题
 · 用ASP创建多栏选项列表S
 · 如何把ASP编写成DLL
 · Windows XP 中IIS5安装文
 · OpenSchema 方法详
 最新上传文章
 · 使用 cookie 
 · Asp Object 之
 · 建立企业信息化 &n
 · 80后IT四少:媒体塑造了我
 · 我国企业电子商务交易总
 · asp连接带有密码的acces
 · 互联网应用广泛 电
 · Adobe Illustrator
 · delphi程序打包安装制作
 · 企业邮件管理有新招&nbs
 · toolbar图标:ToolBar上的

服务说明 | 关于网站 | 联系我们 | 友情链接
网站学习网欢迎您!
http://www.studywebgood.com
浙ICP备07030755号 
联系邮箱:shuizhilang@126.com 如本网站侵犯了您的版权,请马上通知我.