ASP编程:一种效力极高的分类算法
由于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(
NOTNULL,
(50)NOTNULL,
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(
NOTNULL,
NOTNULL,
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语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; 它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。 运用经典的例子。并且自己可以用他来实现一些简单的系统。如果可以对他进行进一步的修改,找出你觉得可以提高性能的地方,加上自己的设计,那就更上一个层次了,也就会真正地感到有所收获。 多看多学多思。多看一些关于ASP的书籍,一方面可以扩展知识面一方面可以鉴借别人是如何掌握、运用ASP的;多学善于关注别人,向同学老师多多学习,不论知识的大小;多思则是要将学到的知识灵活运用。 兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的 Session:这个存储跟客户端会话过程的数据,默认20分钟失效 不是很难但是英文要有一点基础网上的教程很少有系统的详细的去买书吧,另不用专门学习vb关于vbscript脚本在asp教材都有介绍 不是很难但是英文要有一点基础网上的教程很少有系统的详细的去买书吧,另不用专门学习vb关于vbscript脚本在asp教材都有介绍 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 接下来就不能纸上谈兵了,最好的方法其实是实践。实践,只能算是让你掌握语言特性用的。而提倡做实际的Project也不是太好,因为你还没有熟练的能力去综合各种技术,这样只能使你自己越来越迷糊。
页:
[1]