难题:从文件中读取数据构造树,解决构造效率的问题! (200分)

  • 主题发起人 主题发起人 Taiji02
  • 开始时间 开始时间
T

Taiji02

Unregistered / Unconfirmed
GUEST, unregistred user!
这些数据保存在文件中,要求不能用数据库,文件结构也可以自己设计。
关键是如何如何高效率地构造树?

我设计的文件存储方式是:
ID
ParentID
titleLength
title(这个是不定长的)
用我的方法文件不大时还行,当文件很大(2M多)时,程序运行了几分钟也没搞定,关键是怎样得到父节点的Node,我用的搜索,但是效率随着文件的增大而大降低,因此在此希望得到高手的帮助。
 
该是索引文件闪亮登场的时候了,里面存ID及该ID在数据文件的偏移。
至于索引文件本身,用hash和B+都可以。
 
对,数据库那么快的速度主要也是依靠索引吧,路过,随便说说
 
如果数据总量不大,全部读到内存里,用个hash表存起来,再构造树,也是very fast的。
 
存储不是问题,问题是构造树的过程中要查找父节点,这样速度很慢哦!
比如现在读出来的节点应该是哪个节点的子节点,这个父节点找起来很慢哦!
 
哪位大虾给点具体点的算法嘛!
 
举个最简单的hash了例子,你把记录全部读到一个数组里,记录的ID=数组的下标。
这时候你再来构造树,不就能直接根据parentID找到数组中相应的记录了嘛。
 
存放的时候就采用排序和索引!
 
对,根据parentID找到数组中相应的记录很容易,但要找到这个元素对应的TTreeView中的Node不好找,我用以下的方法:
TreeNode * SearchNode(int Parentid)
{
for (i=0 ;i<TreeView1->Items->Count;i++)
{
if (PNODEINFO(TreeView1->Items->Item)->ParentID==Parentid)
return TreeView1->Items->Item;
return NULL;
}
}

在这里读出ParentID
TreeView->Items->AddChildObject(SearchNode(ParentID),"test",Object);
数据大的时候这样很慢!
 
呵呵,容易呀。
干脆把TreeNode的指针也做为数组元素中的一个属性不就结了。
 
To LeeChange:
有道理,我愿意试一下。

但是每读一个节点还是要搜索一次哦。
 
后退
顶部