无限制深度与级别的树形结构数据库中定义表结构如下
字段1            字段2
记录ID           父节点记录ID构成一个自关联的树形层次结构,现在用树形控件TreeView显示它
加载方法如下:
1.一次查询全部记录,遍历记录集,把数据全部ADD到TreeView控件中显示(非层次结构显示)
2.遍历TreeView,用movechild方法,按照  记录ID 、 父节点记录ID 关系调整结构为树形层次结构。
问题是当节点多与层次复杂时,加载非常慢(出现了迪卡尔乘积)
高手有没有好的算法?不想改变库结构设计
谢谢!

解决方案 »

  1.   

    树形控件的数据载:
     数据库原始数据---视图数据---排序(这很重要,主要是确定树形的LEVEL)---算法
      

  2.   

    http://blog.csdn.net/myy/用的是你一样的算法,不明白,为什么会出现“出现了迪卡尔乘积”?
      

  3.   

    我明白了,楼主好好看看 http://blog.csdn.net/myy/ 我写的算法吧,
    其实调整节点只需要遍历一次就行了!
      

  4.   

    这里 if(-1==(idx=ss->IndexOf(AnsiString(ndata->pid)))) 感觉好像还是乘积,只是IndexOf内部可能有算法,处理的很快。非常感谢myy() ,您是俺的明灯,明天试试效果。
      

  5.   

    关于 if(-1==(idx=ss->IndexOf(AnsiString(ndata->pid)))) 其目地是为了做 ID <--> TTreeNode* 之间的对照表,便于快速查找,这里只是为了简单起见用 TStringList,其实慢的主要是遍历数据集...如果节点极多,用TStringList查找效率可能不太高。可以用 THashedStringList代替,查找速度能提高很多(100多倍,见http://delphi.sharpplus.com/Delphi/delphi_collection.htm)如果用BCB, 也可以用C++中 std:map 等快速容器。
      

  6.   

    在大数据量下效率会不会变慢,例如:父子节点上万的情况下------呵呵,你可以自己测试看看...还是那句话,慢的主要是遍历数据集,查找(hash方式)和移动节点与之相比不足道。当然了,如果你节点实在太多,而且可以不“一次全部载入”,可以考虑“逐层载入”的方式,只是程序要做更复杂的控制了。
      

  7.   

    测试了一下,1万多父子节点数据显示出来大约是10秒左右,要是能控制在6秒左右就好了.
    ------
    想问一下:1. 你用THashedStringList了吗?
    2. 单独“遍历数据集”的时间是多少?
      

  8.   

    是用的THashedStringList
    设断点跟踪了一下IndexOf(AnsiString(ndata->pid)))) 是不占时间的
    遍历数据集因该1秒左右
    我的节点是三种结构数据拼成的,所以可能慢点吧