|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况;算法分类算法要办理的成绩
在网站建立中,分类算法的使用十分的广泛。在计划一个电子商铺时,要触及到商品分类;在计划公布体系时,要触及到栏目大概频道分类;在计划软件下载如许的程序时,要触及到软件的分类;云云等等。能够说,分类是一个很广泛的成绩。
我经常口试一些程序员,并且我几近毫无破例地要问他们一些关于分类算法的成绩。上面的举几个我经常扣问的成绩。你以为你能够很轻松地回覆么^_^.
1、分类算法经常体现为树的暗示和遍历成绩。那末,叨教:假如用数据库中的一个Table来表达树型分类,应当有几个字段?
2、怎样疾速地从这个Table恢复出一棵树;
3、怎样判别某个分类是不是是另外一个分类的子类;
4、怎样查找某个分类的一切产物;
5、怎样天生分类地点的路径。
6、怎样新增分类;
在不限定分类的级数和每级分类的个数时,这些成绩并非能够轻松回覆的。本文试图办理这些成绩。
分类的数据布局
我们晓得:分类的数据布局实践上是一棵树。在《数据布局》课程中,人人大概学过Tree的算法。因为在网站建立中我们大批利用数据库,以是我们将从Tree在数据库中的存储谈起。
为简化成绩,我们假定每一个节点只必要保存Name这一个信息。我们必要为每一个节点编号。编号的办法有良多种。在数据库中经常使用的就是主动编号。这在Access、SQLServer、Oracle中都是如许。假定编号字段为ID。
为了暗示某个节点ID1是别的一个节点ID2的父节点,我们必要在数据库中再保存一个字段,申明这个分类是属于哪一个节点的儿子。把这个字段取名为FatherID。如这里的ID2,其FatherID就是ID1。
如许,我们就失掉了分类Catalog的数据表界说:
CreateTable[Catalog](
[ID][int]NOTNULL,
[Name][nvarchar](50)NOTNULL,
[FatherID][int]NOTNULL
);
商定:我们商定用-1作为最下面一层分类的父亲编码。编号为-1的分类。这是一个假造的分类。它在数据库中没有纪录。
怎样恢复出一棵树
下面的Catalog界说的最年夜上风,就在于用它能够轻松地恢复出一棵树―分类树。为了更分明地展现算法,我们先思索一个复杂的成绩:如何显现某个分类的下一级分类。我们晓得,要查询某个分类FID的下一级分类,SQL语句十分复杂:
selectNamefromcatalogwhereFatherID=FID
显现这些种别时,我们复杂地用<LI>来做到:
<%
REMoConn---数据库毗连,挪用GetChildren时已翻开
REMFID-----以后分类的编号
FunctionGetChildren(oConn,FID)
strSQL="selectID,NamefromcatalogwhereFatherID="&FID
setrsCatalog=oConn.Execute(strSQL)
%>
<UL>
<%
DowhilenotrsCatalog.Eof
%>
<LI><%=rsCatalog("Name")%>
<%
Loop
%>
</UL>
<%
rsCatalog.Close
EndFunction
%>
如今我们来看看怎样显现FID下的一切分类。这必要用到递回算法。我们只必要在GetChildren函数中复杂地对一切ID举行挪用:GetChildren(oConn,Catalog(“ID”))就能够了。
<%
REMoConn---数据库毗连,已翻开
REMFID-----以后分类的编号
FunctionGetChildren(oConn,FID)
strSQL="selectNamefromcatalogwhereFatherID="&FID
setrsCatalog=oConn.Execute(strSQL)
%>
<UL>
<%
DowhilenotrsCatalog.Eof
%>
<LI><%=rsCatalog("Name")%>
<%=GetChildren(oConn,Catalog("ID"))%>
<%
Loop
%>
</UL>
<%
rsCatalog.Close
EndFunction
%>
修正后的GetChildren就能够完成显现FID分类的一切子分类的义务。要显现一切的分类,只必要云云挪用就能够了:
<%
REMstrConn--毗连数据库的字符串,请依据情形修正
setoConn=Server.CreateObject("ADODB.Connection")
oConn.OpenstrConn
=GetChildren(oConn,-1)
oConn.Close
%>
怎样查找某个分类的一切产物;
如今来办理我们在后面提出的第四个成绩。第三个成绩留作习题。我们假定产物的数据表以下界说:
CreateTableProduct(
[ID][int]NOTNULL,
[Name][nvchar]NOTNULL,
[FatherID][int]NOTNULL
);
个中,ID是产物的编号,Name是产物的称号,而FatherID是产物所属的分类。
对第四个成绩,很简单想到的举措是:先找到这个分类FID的一切子类,然后查询一切子类下的一切产物。完成这个算法实践上很庞大。代码大抵以下:
<%
FunctionGetAllID(oConn,FID)
DimstrTemp
IfFID=-1then
strTemp=""
else
strTemp=","
endif
strSQL="selectNamefromcatalogwhereFatherID="&FID
setrsCatalog=oConn.Execute(strSQL)
DowhilenotrsCatalog.Eof
strTemp=strTemp&rsCatalog("ID")&GetAllID(oConn,Catalog("ID"))REM递回挪用
Loop
rsCatalog.Close
GetAllID=strTemp
EndFunction
REMstrConn--毗连数据库的字符串,请依据情形修正
setoConn=Server.CreateObject("ADODB.Connection")
oConn.OpenstrConn
FID=Request.QueryString("FID")
strSQL="selecttop100*fromProductwhereFatherIDin("&GetAllID(oConn,FID)&")"
setrsProduct=oConn.Execute(strSQL)
%>
<UL><%
DowhilenotrsProduct.EOF
%>
<LI><%=rsProduct("Name")%>
<%
Lo</p>由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; |
|