有谁有分类算法的好例子?我给高分!!!!

tiandiqing 2002-12-27 09:59:38
有谁有分类算法的好例子?
但是这样的除外:
这样,我们就得到了分类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-----当前分类的编号



Function GetChildren(oConn,FID)

strSQL = "select Name from catalog where FatherID="&FID

set rsCatalog = oConn.Execute(strSQL)

%>

<UL>

<%

Do while not rsCatalog.Eof

%>

<LI><%=rsCatalog("Name")%>

<%=GetChildren(oConn,Catalog("ID"))%>



<%

Loop

%>

</UL>

<%

rsCatalog.Close

End Function

%>

修改后的GetChildren就可以完成显示FID分类的所有子分类的任务。要显示所有的分类,只需要如此调用就可以了:

<%

REM strConn--连接数据库的字符串,请根据情况修改

set oConn = Server.CreateObject("ADODB.Connection")

oConn.Open strConn

=GetChildren(oConn,-1)

oConn.Close

%>



如何查找某个分类的所有产品;
现在来解决我们在前面提出的第四个问题。第三个问题留作习题。我们假设产品的数据表如下定义:

Create Table Product(

[ID] [int] NOT NULL,

[Name] [nvchar] NOT NULL,

[FatherID] [int] NOT NULL

);

其中,ID是产品的编号,Name是产品的名称,而FatherID是产品所属的分类。

对第四个问题,很容易想到的办法是:先找到这个分类FID的所有子类,然后查询所有子类下的所有产品。实现这个算法实际上很复杂。代码大致如下:

<%

Function GetAllID(oConn,FID)

Dim strTemp



If FID=-1 then

strTemp = ""

else

strTemp =","

end if



strSQL = "select Name from catalog where FatherID="&FID

set rsCatalog = oConn.Execute(strSQL)

Do while not rsCatalog.Eof

strTemp=strTemp&rsCatalog("ID")&GetAllID(oConn,Catalog("ID")) REM 递归调用

Loop

rsCatalog.Close



GetAllID = strTemp

End Function



REM strConn--连接数据库的字符串,请根据情况修改

set oConn = Server.CreateObject("ADODB.Connection")

oConn.Open strConn



FID = Request.QueryString("FID")



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

%>
我相要这样的:

用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。(我是不是太罗嗦了J,但这一点很重要。再回头看看我们前面提到的第五个问题。哈哈,这不就已经得到了分类1092787200所在的分类路径了吗?)。
...全文
57 点赞 收藏 1
写回复
1 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tiandiqing 2002-12-27
没能人会??????????????????
回复
相关推荐
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2002-12-27 09:59
社区公告
暂无公告