首页 新闻 会员 周边

树结构的经典应用是什么?小白学习

1
悬赏园豆:200 [已解决问题] 解决于 2012-08-03 23:14

树结构的应用:

二叉树?就是为了范围查找?感觉可以用排序后线型结构还不是一样的?真不懂。从来没有应用过树

C#
RabbitYi的主页 RabbitYi | 初学一级 | 园豆:10
提问于:2012-07-29 10:39
< >
分享
最佳答案
2

霍夫曼编码,游戏开发中非常有名的八叉树体积碰撞检测,查询海量数据的十叉树。数据存储的树,应用很多很多的。

收获园豆:30
需要格局 | 老鸟四级 |园豆:2145 | 2012-07-29 11:30

霍夫曼编码知道是用于压缩的,但不知道为什么要用树,而不用普通的结果呢?

RabbitYi | 园豆:10 (初学一级) | 2012-07-29 16:55

@Rabbit_Yi: 

 

这是因为计算机内存寻址造成的结果。

需要格局 | 园豆:2145 (老鸟四级) | 2012-07-29 17:06

@田麦成: 能不能说的详细点呢?谢谢

RabbitYi | 园豆:10 (初学一级) | 2012-07-29 17:13
其他回答(6)
0

树结构可不止二叉树。。。。平衡树。。。。B-树,多呢,查找时用的时间不一样

羽商宫 | 园豆:2490 (老鸟四级) | 2012-07-29 11:05

关键是没有发现这些树的优势在哪里?

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-07-29 15:58
1

以前有用过树状数据库,查找速度很快!特别是大型应用

Tom.汤 | 园豆:3028 (老鸟四级) | 2012-07-29 11:26

树状数据库?没有用过,有什么经典的应用吗?

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-07-29 16:15

@Rabbit_Yi: 

名字叫Cache吧,具体有点忘了,是一个海量数据的数据库

支持(0) 反对(0) Tom.汤 | 园豆:3028 (老鸟四级) | 2012-07-29 16:25

@Tom.汤:  你说的是NoSQL吗?

支持(1) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-07-29 16:58

@Rabbit_Yi: 

不是!数据库的名字就是Cache。具体没怎么了解,数据的存储结构是树状的。

支持(0) 反对(0) Tom.汤 | 园豆:3028 (老鸟四级) | 2012-07-29 20:39

@Rabbit_Yi: 

其实文件目录就是一个树,寻址算法,也算是树结构的一个应用

支持(0) 反对(0) Tom.汤 | 园豆:3028 (老鸟四级) | 2012-08-01 12:46
1

磁盘目录和文件不就是例子么。

霜天雪舞 | 园豆:214 (菜鸟二级) | 2012-07-30 09:13

是,这个是很经典,能否再介绍一下我们开发会用到的,除了树控件以外的。。

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-08-01 19:40
2

树结构的经典应用就是关系型数据库、编译器。

Launcher | 园豆:45045 (高人七级) | 2012-07-30 09:14

没有看出来关系型数据库哪里用到树结构了?请指教。。

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-07-30 20:08

@Rabbit_Yi: 如果你有时间的话,可以找几本大学教材来读,比如《数据库原理》,《编译原理》里面都会讲到。

支持(1) 反对(0) Launcher | 园豆:45045 (高人七级) | 2012-07-31 09:27

学过数据库原理,但是还是不太清楚树结构的经典应用,能否介绍一下,谢谢

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-08-01 19:39
1

树主要是红黑树平衡树,用来动态维护数据。

用LZ方法,构建一个数组,快排排好序nlogn。查找很方便O(1)。但是添加和删掉一条数据时间复杂度是O(N),一个大部队往后挪一个往前挪,如果是大型数据的话,100万条记录的话,光删除添加操作这时间就要很久。而且大数据空间申请...难搞。

但是我用红黑树,我添加,查找,删除都是log(n),log(n)跟O(n)差距还是很大的。而且空间申请释放,方便!

数据是永远是活的,数据库,系统内核里面很多东西都是用树。

收获园豆:150
morphling.huang | 园豆:352 (菜鸟二级) | 2012-07-30 10:14

我只是打个比方,如果你要删除快的话就可以用链表,貌似也比树要快,请指教?

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-07-30 20:06

仁兄果然有见地啊。。

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-07-30 20:09

@Rabbit_Yi: 链表没排序功能,而且查找O(N)。

支持(0) 反对(0) morphling.huang | 园豆:352 (菜鸟二级) | 2012-07-31 09:29

嗯。。不过链表是有排序功能的,且查找也不一定比树慢。是吧。。

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-08-01 19:36

@Rabbit_Yi: 既然选择了链表,就排除给他排序了。如果要新插入结点的时候给他找插入位置让他继续有序,那光查找就要O(N)了,删除也是,这是相当耗时的。既然查找是O(N),肯定比树的O(lgn)慢。

支持(0) 反对(0) morphling.huang | 园豆:352 (菜鸟二级) | 2012-08-02 10:59
1

如果是开发,树结构就好比树控件,涉及的操作当然就是树的常用操作了,最重要的,也是难点就是父子节点的问题了。下面给出我的商业代码,父子节点自动递归函数。你这200分可要多给我考虑点哟。

 

--查询所有子模块的表值函数
CREATE FUNCTION [dbo].[FN_GetSubModule] (@id AS INT )
RETURNS @temp TABLE
    (
      [id] INT ,
      [parentid] INT ,
      [Code] NVARCHAR(50) ,
      [FullName] NVARCHAR(200) ,
      [Category] NVARCHAR(50),
      [ImageIndex] NVARCHAR(50),
      [Target] NVARCHAR(100),
      [IsPublic] INT,
      [SortCode] INT,
      [levels] INT --levels表示栏目层次的,是必须有的!
    )
AS 
    BEGIN        
        DECLARE @level AS INT    --声明一个变量,用于保存栏目信息层次索引
        SELECT  @level = 0
        INSERT  INTO @temp
                SELECT  Id,
                        ParentId ,
                        Code ,
                        fullName ,
                        Category,
                        ImageIndex,
                        Target,
                        IsPublic,
                        SortCode,
                        @level
                FROM    dbo.PiModule
                WHERE   Id = @id AND DeleteMark = 0
    --先根据id获取根据节点的数据,@level初始为0,表示根目录
        WHILE @@rowcount > 0 
            BEGIN
                SET @level = @level + 1      
                INSERT  INTO @temp
                        SELECT  a.id ,
                                a.ParentId ,
                                a.Code ,
                                a.FullName ,
                                a.Category,
                                a.ImageIndex,
                                a.Target,
                                a.IsPublic,
                                a.SortCode,
                                @level
                        FROM    PiModule a
                                INNER JOIN @temp t ON a.parentid = t.id
                                                      AND t.levels = @level - 1   
                                                      AND a.DeleteMark = 0          
            END 
        RETURN    
    END

GO

 

 

收获园豆:20
.NET快速开发框架 | 园豆:946 (小虾三级) | 2012-07-30 16:12

不好意思,我要的不是这个。

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-07-30 20:07

@Rabbit_Yi: 这么说我白贡献了?

哎,识货者大智也。

支持(0) 反对(0) .NET快速开发框架 | 园豆:946 (小虾三级) | 2012-07-30 21:34

呵呵,我想知道的是树相关的经典应用,树控件用过呢,还是给你分。

支持(0) 反对(0) RabbitYi | 园豆:10 (初学一级) | 2012-08-01 19:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册