erlang 数据结构 -- gb_trees

本文介绍了Erlang中的gb_trees数据结构,它是一个基于AA树实现的key-value存储,适用于大量有序数据。重点讨论了gb_trees的特性,如使用平衡树确保查找效率,并列举了几个关键函数:balance()用于手动平衡树,iterator/1和next/1提供迭代操作,以及map/2函数。相较于dict,gb_trees提供了有序性优势,适合需要有序且规模较大的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 今天是gb_trees

1.1 key-value 数据结构
1.2. AA树实现, (AVL, RB-tres, AA 树区别看:地址
1.3. 定义: {Size, Tree} — Tree:: 有元素为 {Key, Value, Smaller::Tree, Bigger::Tree} 或者空树nil组成
1.4. ==来判断是否相同, 也就是说1, 1.0 是一个键值
1.5 用来存储大量数据(有序的)

2. 函数(一些值得注意的函数)

2.1 balance(Tree1) -> Tree2
用来重新平衡树, 一般情况下,不需要调用这个函数。 除非有很多删除操作, 而期间又没有插入操作的时候, 可以手动调用,因为delete操作后不会重新平衡树。 重新平衡树可以减少查找的时间.

2.2 iterator/1 next/1
迭代操作, 官方说这个函数遍历的执行时间略差于gb_trees:to_list 之后遍历的时间, 但是好处在于不需要一下子生成一个长列表
1> G1 = gb_trees:insert(1, a, gb_trees:empty()).
{1,{1,a,nil,nil}}
2> It = gb_trees:iterator(G1).
[{1,a,nil,nil}]
3> {Key, Value, It1} = gb_trees:next(It).
{1,a,[]}
4> gb_trees:next(It1).
none

2.3 map/2
5> gb_trees:to_list(G1).
[{1,a}]
6> F = fun(Key, Value) -> Key end.
#Fun<erl_eval.12.52032458>
7> gb_trees:to_list(gb_trees:map(F, G1)).
[{1,1}]

3. 使用场景

我们知道dict,和gb_trees 都可以用来存储大量的数据,两者的区别?
基本差不多,dict 往往有更好的读取速度,但是两者有不同的接口,比如gb_trees 有取最大值的接口。 我觉的最主要的是gb_trees 可以认为是有序的。如果是需要有序的场景,而且数量级较大, 那么orddict 不合适, dict也不合适, gb_trees是很好的选择。

参考:http://learnyousomeerlang.com/a-short-visit-to-common-data-structures

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值