当前位置: 首页 > 图文教程 > 网络编程 > ASP > 一种效率极高的分类算法(转--非常好,帮助很大对于想做好asp的朋友)

ASP
Access 2000 数据库 80 万记录通用快速分页类
Microsoft JET Database Engine 错误 ''80004005'' 未指定的错误的完美解决方法
收藏的ASP常用的函数集
asp分页的一个类
ASP开发网页牢记注意事项
ASP下操作Excel技术总结分析
ASP数据岛操作类
ASP经典分页类
asp论坛在线人数统计研究
ASP调用SQL SERVER存储程序
asp输出bmp
ASP连接数据库的全能代码
ASP面向对象编程探讨及比较
web文件管理器的后续开发
一小偷类!!有兴趣的可以看看
利用ASP实现事务处理的方法
大数量查询分页显示 微软的解决办法
如何把ASP编写成DLL
asp实现树型结构
超级ASP大分页_我的类容我做主

ASP 中的 一种效率极高的分类算法(转--非常好,帮助很大对于想做好asp的朋友)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 223 ::
收藏到网摘: n/a

       分类算法要解决的问题
  在网站建设中,分类算法的应用非常的普遍。在设计一个电子商店时,要涉及到商品分类;在设计发布系统时,要涉及到栏目或者频道分类;在设计软件下载这样的程序时,要涉及到软件的分类;如此等等。可以说,分类是一个很普遍的问题。
  
  我常常面试一些程序员,而且我几乎毫无例外地要问他们一些关于分类算法的问题。下面的举几个我常常询问的问题。你认为你可以很轻松地回答么^_^.
  
  1、分类算法常常表现为树的表示和遍历问题。那么,请问:如果用数据库中的一个Table来表达树型分类,应该有几个字段?
  2、如何快速地从这个Table恢复出一棵树;
  3、如何判断某个分类是否是另一个分类的子类;
  4、如何查找某个分类的所有产品;
  5、如何生成分类所在的路径。
  6、如何新增分类;
  
  在不限制分类的级数和每级分类的个数时,这些问题并不是可以轻松回答的。本文试图解决这些问题。
  
  分类的数据结构
  我们知道:分类的数据结构实际上是一棵树。在《数据结构》课程中,大家可能学过Tree的算法。由于在网站建设中我们大量使用数据库,所以我们将从Tree在数据库中的存储谈起。
  
  为简化问题,我们假设每个节点只需要保留Name这一个信息。我们需要为每个节点编号。编号的方法有很多种。在数据库中常用的就是自动编号。这在Access、SQL Server、Oracle中都是这样。假设编号字段为ID。
  
  为了表示某个节点ID1是另外一个节点ID2的父节点,我们需要在数据库中再保留一个字段,说明这个分类是属于哪个节点的儿子。把这个字段取名为FatherID。如这里的ID2,其FatherID就是ID1。
  
  这样,我们就得到了分类Catalog的数据表定义:
  
  Create Table [Catalog](
  
   [ID] [int] NOT NULL,
  
   [Name] [nvarchar](50) NOT NULL,
  
   [FatherID] [int] NOT NULL
  
  );
  
  约定:我们约定用-1作为最上面一层分类的父亲编码。编号为-1的分类。这是一个虚拟的分类。它在数据库中没有记录。
  
  如何恢复出一棵树
  上面的Catalog定义的最大优势,就在于用它可以轻松地恢复出一棵树—分类树。为了更清楚地展示算法,我们先考虑一个简单的问题:怎样显示某个分类的下一级分类。我们知道,要查询某个分类FID的下一级分类,SQL语句非常简单:
  
  select Name from catalog where FatherID=FID
  
  显示这些类别时,我们简单地用<LI>来做到:
  
  
  
  <%
  
  REM oConn---数据库连接,调用GetChildren时已经打开
  
  REM FID-----当前分类的编号
  
  
  
  Function GetChildren(oConn,FID)
  
   strSQL = "select ID,Name from catalog where FatherID="&FID
  
   set rsCatalog = oConn.Execute(strSQL)
  
  %>
  
   <UL>
  
  <%
  
   Do while not rsCatalog.Eof
  
  %>
  
   <LI><%=rsCatalog("Name")%>
  
  <%
  
   Loop
  
  %>
  
   </UL>
  
  <%
  
   rsCatalog.Close
  
  End Function
  
  %>
  
  现在我们来看看如何显示FID下的所有分类。这需要用到递归算法。我们只需要在GetChildren函数中简单地对所有ID进行调用:GetChildren(oConn,Catalog(“ID”))就可以了。
  
  <%
  
  REM oConn---数据库连接,已经打开
  
  REM FID-----当前分类的编号