问:有谁有处理树形(层状)数据的好办法? (200分)

  • 主题发起人 主题发起人 ddev
  • 开始时间 开始时间
D

ddev

Unregistered / Unconfirmed
GUEST, unregistred user!
现在的数据结构实在是太复杂,
如果有这么一个 API/CLASS 该有多好...
 
XML

最适合处理树形数据!相信俺,没错的!!
 
看过电影《毕业生》吗? 霍夫曼的毕业晚会上,那个商人拉住霍夫曼只说了一个字:

Plastic

如果是今天,他可能说的就会是:

XML
 
不会吧,我看 Linux 下的
SubSection
EndSection

的处理结构也要比 XML 好得多。
XML 虽然不错,但也不是万能之药吧。效率就其中之一。

不管是一个文本处理类,还是一个二进制文件流,
只要能很好地处理就行!
 
搞不懂你要什么,DBTree?
 
可能是我问题提得不清楚,我重说一下:其实就是类似于 Registery 那样的
数据(文件)表,能实现层状表达。

这个问题想必大家也经常遇到:比如一个部门,下面有它的子部门,每个子部门
可能还有它的 -- 孙部门...假设就需要这样一个索引(编码)树,则采用格式化的
文本(二进制文件也行)能够表达这种层状关系 -------- 我要的就是这个东东啊。

注:千万不要用关系数据库的那种表达 ---------- 我想实在是没有必要。七八个
数据十来张表,可也太费了,呵呵。
 
dexdbtreeview
很好用的(可以一个表
 
我认为链表和二叉树或许有帮助。
 
还要补充说明一点:是数据的存储方式而不是表达方式。
 
在内存中用object做映象。每个类中加入一个SaveToStream方法,实现数据的存贮。
每个类中都加入从下层子类中搜索某个类的方法或者单独写一个遍历树的函数也可以呀。
至于在数据库中保存则使用parent安段来描述其父项的ID。这个问题本论坛有很多这样
的贴子。
 
其实数据的存储方式也可以很简单的,只是你需求不简单罢了.

例如:
ID,PID,TEXT三个字段就可以组成一棵树了,有什么麻烦呢?
 
你可以把你的树形数据结构转换为关系型或线型,复杂二叉树可以转换为平衡二叉树,
而平衡二叉树是可以线性化的(Serialize)当前只能这样做了,因为你只有链表和关系
形数据库好用。
 
to 楼上各位:

; ; 你们想法都有一定的道理。但我想 -------------- 或许和 CJF 兄说的,
是有点要求的,呵呵。

; ; Registry 是大家最熟悉不过的,根据我的映象,它应该是一个层状数据库。
关系数据库虽然不错,但在维护方面可能有着许多的麻烦。因为本质上讲,关系
数据库(表)本就不是为表达层状数据的,而是只处理二维数据逻辑。

; ; 虽然可能完全是没有希望,但我也正想尝试这样的数据表逻辑。这样可以免
除使用 Windows 的注册系统了。而能够在我自己的应用中自由支配,Just like
WinINI(PrivateIni)。因为我发现,有大量的数据都符合这样的数据逻辑,特别
是一些配置信息或基本索引(编码)信息,更是遇着多多。但目前而言,却只能
用系统注册表或者复杂的 INI 结构,甚至关系表(这是我最讨厌的,因为这些
信息的检索频度可能很高,数据表的许多性能均不如文本或者特定的Binary)。

于是我想做 ----------- 呵呵,没有现成的,就自己做一个!虽然我想成功
与否实在难料,但总想尝试一下。由于在树的存储方面的理论知识不足,所以还是
要请教请教大家,指条道。它的基本要求应该与 INI 相似,没有网络或者共享方面
的特别要求,但要求简洁,快速以及访问方便。简单地讲,就是实现如:

; ; PAnyNode = ^TAnyNode;
; ; TAnyNode = record
; ; ; ; NodeData: TList;//一个形如 INI:Key = Value 的列表
; ; ; ; SubNodes: TList;//一个 PAnyNode 类型的结点列表
; ; end;

的存储管理。希望大家都出主意,谢谢。
 
呵呵,用Microsoft的结构化存贮,似乎Windows的Registry也是这样实现的。
我记得讲COM的书上会讲到,讲Windows外壳编程的书也会讲到。
 
我已经想到了,不过那么麻烦,可以用文本实现,参考 Linux
下的文本处理模式及 HTML 格式,可以直接用文本实现。例如:

.section "your_section_name"
; ; Item1=Value1
; ; Item2=Value2

; ; .section "your_subsection_name"
; ; ; ; subKey=subValue
; ; .endsection
;
; ; other_Item_list
.endsection

注:析分路径表达最好能与标准 INI 相似,而不要太复杂。如上面的
结构可以表达为:GetValue("your_section_name/your_subsection_name", subKey, '');
这样有什么问题吗?

其实只要能够确定一个界限,想必各位肯定能作出一个更好的类处理吧。
如果有谁能够提供算法,在此得分的基础上,另加 200 大分!

所以问题暂时不先消了,分是见者有份。能够解释算法人的可以多一些。
谢谢!
 
如果是通过数据库进行实现的话,就很简单了,如果不是的话,可能要搞一个类数据库的引擎了.
 
只是处理好每一个数据的父与子就可以了,一个数据只有一个父,但是可以有多个子

无父的数据就是数据之巅,也就是树的根,无子的数据就是数据之末,就是树的叶;

这样所有的数据就会是同一个结构了。 ;
 
多人接受答案了。
 

Similar threads

后退
顶部