非递归算法的树状显示,请给出要点!

尘雨 2002-05-26 12:10:46
我看到有些朋友使用非递归算法来显示树状结构,是把递归算法按照顺序写法写出来,不是很明白,谁能解释一下,递归算法快不快,各有说法,我认为不是一个很快的算法,消耗的资源太大了,一般论坛都用的什么算法?
...全文
58 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
尘雨 2002-05-27
  • 打赏
  • 举报
回复
感谢大家的捧场!我觉得大家都说出了一些很重要东西,虽然我的问题还没有得到完全的答复,不过也让我想到了很多东西
夜鹰兄,你的方法很类似于我的现在使用的方法,就是在数据表中有一个排序字段,按照算法算出一个排序串,然后拍续即可。所不同的是,你用的是浮点型数据,而我用的是一个4096长的varchar型字段,层数越深,这个值就会越长
比如
序号(自动增加) 内容 indent order
1 xxxx 0 1
2 xxxx 1 1*000000001
3 xxxx 0 3
这个排序串的速度虽然还不错,没有用到递归,但我觉得还是不够快,不知道sql server 对长字符串的排序速度是不是低于浮点数的排序,这是一个很需要知道的问题,至于递归算法的优缺点大家都比较公认了
先给分
Lostinet 2002-05-26
  • 打赏
  • 举报
回复
:)
用一条链来记录状态就好了。
spgoal 2002-05-26
  • 打赏
  • 举报
回复
非递归的实现,应该用一个堆栈来实现
Lostinet 2002-05-26
  • 打赏
  • 举报
回复
我觉得递归是最快的了。。
用关系链还得算关系。
----------------------
不过我昨天写的算质数的就没有用递归了。。

function Calc1(n)
{
if(n<1)throw("Invalid Arguments");
var arr=new Array();
var arr2=new Array();
arr[0]=2;
arr2[0]=2*2;
for(var i=2;i<=n;i++)
f(n);
return arr[arr.length-1];
return (function(){
var res=0;
for(var i=0;i<arr.length;i++)res+=arr[i];
return res;
})();
function f(n)
{
var i=0;
var b=arr[arr.length-1];
var shouldbreak=false;
while(true)
{
b++;
for(i=0;i<arr.length;i++)
{
if(b%arr[i]==0)
break;
if(arr2[i]>b)
{
shouldbreak=true;
break;
}
}
if(i==arr.length)break;
if(shouldbreak)break;
}
arr[arr.length]=b;
arr2[arr2.length]=b*b;
}
}

var d1=new Date().getTime();
var v1=Calc1(1000);
var d2=new Date().getTime();
alert((d2-d1)+"ms - result:"+v1);
MeXP 2002-05-26
  • 打赏
  • 举报
回复
递归算法确实耗资源,采用它实现的较多
julyclyde 2002-05-26
  • 打赏
  • 举报
回复
递归的不快。
一般都用它
zhenhao 2002-05-26
  • 打赏
  • 举报
回复
用ASP实现网站的“目录树”管理

1.tblCategory

字段名 类型

Root binary 说明树关或开(目录的根)

ID 自动编号 关键字

Sort integer 识别该字段内容的整数(如果root是开状态sort为0)表示显示的目录的顺序

Name text(255)可以包含html中的标识符

HREF text(255) 允许空





2.tblPages

ID 自动编号

Sort integer 关键字

Name text(255)

HREF text(255)





3.default.htm

〈html>

〈head>

〈title>JavaScript Tree Control Template〈/title>

〈/head>

〈frameset cols="210,*">

?〈frame src="tree.asp" name="TOC">

?〈frame src="main.htm" name="basefrm">

〈/frameset>

〈/html>



4.main.htm

〈head>〈title>〈/title>〈/head>

〈body>

〈h2>Start Page〈/h2>

〈/body>

〈/html>



5.tree.asp

Set conn = Server.CreateObject("ADODB.Connection")

Set Rs = Server.CreateObject("ADODB.Recordset")

conn.open "DRIVER=Microsoft Access Driver (*.mdb);DBQ=" & Server.MapPath("toc.mdb")




strsql = "SELECT tblCategory.Root, tblCategory.[ID], tblCategory.Sort
AS CatSort, tblPages.sort AS LinkSort, tblCategory.[Name] AS CatName,
tblCategory.HREF AS CatURL, tblPages.[Name] AS LinkName, tblPages.href
AS LinkURL FROM tblCategory LEFT JOIN tblPages ON tblCategory.[ID] = tblPages.[ID]
ORDER BY tblCategory.root ASC, tblCategory.Sort, tblPages.sort"



rs.open strsql, conn, 2, 2



if not rs.eof then rs.movefirst

currentID = "" %>

〈html>

〈head>

〈link rel="stylesheet" href="ftie4style.css">

〈!-- Infrastructure code for the tree -->

〈script src="ftiens4.js">〈/script>

〈!-- Execution of the code that actually builds the specific tree -->


〈script>

USETEXTLINKS = 1

〈%

Do While Not Rs.EOF

If Rs("Root") = True Then %>

foldersTree = gFld("〈%= Rs("CatName") %>", "〈%= Rs("CatURL") %>")


〈% Else %>

aux1 = insFld(foldersTree, gFld("〈%= Rs("CatName") %>", "〈%= Rs("CatURL")
%>"))

〈% currentID = Rs("ID")

savedID = Rs("ID")

Do While currentID = savedID and not rs.eof

if Rs("LinkName") 〈> "" Then %>

insDoc(aux1, gLnk(0, "〈%= Rs("LinkName") %>", "〈%= Rs("LinkURL") %>"))


〈%

end if

Rs.MoveNext

if not rs.eof then currentID = Rs("ID")

Loop

End If

if currentID = "" then rs.movenext

Loop %>

〈/script>

〈script>

initializeDocument()

〈/script>

〈base target="basefrm">

〈title>〈/title>

〈/head>

〈body bgcolor="white">

〈/body>

〈/html>
spgoal 2002-05-26
  • 打赏
  • 举报
回复
链表数据结构怎么用ASP实现?用type?
black_bird 2002-05-26
  • 打赏
  • 举报
回复
BBS数据库结构的浮点数表示法
BBS由一系列的文章组成,每篇文章有一些基本属性,比如作者,创建时间,文章编号等

其中最为重要的,用以表示树形结构的是层和序数。层表示位于文章树的第几层,最高

层的帖子层等于0,其回复的层为1,回复的回复层为2,以此类推。所有层等于0的帖子

时间顺序其序数分别为1,2,3.....剩下的帖子的序数满足以下条件:当所有帖子按照树

显示的时候,其序数从大到小排列,没有例外。
上述方法具体到BBS的实现时,各种操作如下进行:
0、系统维护一个记数器,表示当前使用的整数序数。
1、显示帖子列表:依序数值的大小倒序简单地显示即可,帖子的层可帮助决定退格的多
少。
2、新加帖子:如果是层0上的帖子,则取下一个整数序数作为该帖子序数;如果是层L1
帖子,
其序数为N1,则新帖子的层L=L1+1,然后到数据库中查找序数为N1的帖子的下一条帖子
,取
其序数,假设为N2,则新帖子的序数N=(N1+N2)/2。
3、删除帖子:假设是删除层L1,序数为N1的帖子及其所有跟贴,则取层同为L1的下一个
帖子
的序数N2,然后删除所有序数为从N1到N2(不包括N2)的帖子。 0D 上述方法的最大优势在于显示帖子列表时不需要进行任何额外的操作,速度异常的快,
根本不
需要进行任何的递归操作。另外就是分页异常的方便,如果按照每页固定主题数,那么
可以
在SQL查询中仅仅返回当前页的记录,可以将对系统的资源利用降低到最小。即使按照每
页固
定帖子总数,也可以限制SQL查询仅仅返回一页所需的记录。 0D 下面是一个各种值的直观表示(为了容易理解,这里按照序数的升序排列,实际实现时
将按
降序,以让最后的帖子显示在最前面):
1.topic1(层=0,序数=1)
5.Re:topic1(层=1,序数=1.125)
4.Re:topic1(层=1,序数=1.25)
3.Re:topic1(层=1,序数=1.5)
6.Re:Re:topic1(层=2,序数=1.75)
8.Re:Re:Re:topic1(层=3,序数=1.7875)
7.Re:Re:topic1(层=2,序数=1.825)
2.topic2(层=0,序数=2)
10.Re:topic2(层=1,序数=2.5)
9.topic3(层=0,序数=3)
11.Re:topic3(层=1,序数=3.5)
从上面这个例子中可以看出,随着层的增加,以及跟帖的增多,其序数的尾数越来越多
,因此,
这种方法的一个可能的问题是,SQL SERVER中无法表示足够小的浮点数,以至于将两条
帖子的
序数认为是一样的了。经过实验知道,SQL SERVER的浮点数有8位,最多能支持一条帖子
有1023
条回贴。
上述方法的另一个缺点是帖子列表时要做浮点的比较,插入帖子的时候要做浮点的加法
和除法,
不过除法因为刚好是除以2,所以在浮点运算时只需要较少的操作。但这属于机器指令级
的开销
增长,比起在脚本或VB程序里的递归导致WINDOWS系统调用的开销来要小得多,另外,对
系统内存
的要求降低到了最小,因此理论上认为是划算的。
请您就这种方法的可行性进行分析论证,因为我想把它设计成能支持大容量用户访问的
系统,所
以务必经过周密的分析。
================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。0D ★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。
0A
★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.Chi

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧