erlang 数据结构 -- gb_trees

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
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

你可能感兴趣的:(erlang)