| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8531 人关注过本帖, 1 人收藏
标题:字典树(已完成遍历、插入、删除整颗树)
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 20楼 九转星河
树的缺点之一了,空间利用率低下,只是我这个将这一缺点发挥到了一个极点。

要空间还是时间,很难有两全的办法。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 14:31
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 19楼 renkejun1942
以下是引用renkejun1942在2017-6-4 14:22:57的发言:

我没用倒字母占用节点呀,每个节点都是一个完整的单词。只是现在还是初级版本。而且单词是否合法,由另外的函数检查更好。

但是~

Root->Word==NULL也是占用一个节点啊~

其实Root->Word可以理解成是由一个一个节点的关键字凑合起来的单词~

abc占用3个节点
abd和abc一起占用4个节点~
不过如果用位数组记录判断单词是否存在以及具体信息

abc和abd一起也是占用3个节点~~~


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 14:34
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
忘记提及一点了~

struct s
{
    struct* s[26];
    char v[4];//v表示位数组--0代表该位没有单词~1代表有--4个字节刚好相当于1个char*指针大小~
}node;

还可以优化成
struct s
{
    struct** s;
    char v[4];//v表示位数组--0代表该位没有单词~1代表有--4个字节刚好相当于1个char*指针大小~
}node;

struct** s; 这里可以根据有没有后缀来判断是否开辟空间~

如果该单词没有后缀就没必要再开辟空间了(当然这样结构比较复杂~维护难度上升)~


这样输入

abc
abd
就只占用两个节点+一个没有分配索引空间的节点了~

[此贴子已经被作者于2017-6-4 14:48编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 14:42
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 22楼 九转星河
我想想先,这话题以后再说。

[此贴子已经被作者于2017-6-4 14:50编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 14:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 24楼 renkejun1942
这个问题我也想想先~
感觉能优化的除了能在最后一层尽量节省空间外在遍历链中间优化难度比较大了~

当然如果真的修改结构还是可以优化的~
不过……除了要考虑空间和时间复杂度外~还需要考虑算法复杂度以及维护复杂度~那些以后再说吧~
感觉楼主的程序不深究细节方面的话……已经可以了~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 15:03
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 25楼 九转星河
慢慢来呗,反正是临时想到的,不着急,先一点点完成基础。优化什么的,想到灵感了,再来也不迟,这些东西也急不来。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 15:08
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 25楼 九转星河
我读取了一个639kb的文本文档,内存占用是3780。
而我用记事本打开同一个文本文档,内存占用是2320。
内存占用似乎并没有想象中的那么多。
图片附件: 游客没有浏览图片的权限,请 登录注册



[此贴子已经被作者于2017-6-4 17:39编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 17:10
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 27楼 renkejun1942
空间过得去就好~想了一下~发现这效率还是不错的~每个节点输出是108个字节(如果你没有改结构的话)~这空间开销还可以~

接下来试试完成字典树的删除操作~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 18:41
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 28楼 九转星河
删除很简单啊,不需要删除链接,只需要free掉值域就可以了。

唯一我还没想到的东西就是怎么删除掉整颗树。

效率非常不错的,我读取600+kb的文本,瞬间完成并且输出有序的单词,当然,我忘记用别的结构测试了,是否别的结构也能这样快(我用我的那个链表测试,会有大概1秒的卡顿,然后才完成输出)。

在初期,链接占用的确很大,但是当插入的数据多了之后,链接占用就比较少了。

可惜数据还是太小了,更大的英语文本还真不好找。

[此贴子已经被作者于2017-6-4 18:48编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 18:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 29楼 renkejun1942
其实关键在于随机查找的平均速度有巨大的优势~free掉整棵树也是用递归遍历的形式啊~和Print函数的结构差不多~
我也设想到一种AVL树或者红黑树结构储存关键字~用逐字二分法查找~不过那树有三个节点~中间节点为下一级查找~旋转当普通二叉树处理就可以了~那个可以最大限度节约空间~当然这只是设想~现阶段不打算弄出来了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 18:55
快速回复:字典树(已完成遍历、插入、删除整颗树)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023183 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved