erlang 常用数据结构

 

1.树(Tree)是元素的集合

2.每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)

3.树有一个没有父节点的节点,称为根节点

4.没有子节点的节点称为叶节点(leaf)

5.树中节点的最大层次被称为深度

二叉树(Binary Search Tree

1.所有非叶子结点至多拥有两个儿子(Left和Right);

2.所有结点存储一个关键字;

3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

  二叉树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;如果二叉树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么二叉树的搜索性能逼近二分查找。

对于一般的二叉树其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定。但是,在某些极端的情况下(如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,由于在删除时,我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,提高它的操作的时间复杂度。

平衡二叉树(Balanced Binary Tree

 

 

平衡二叉树(Balanced Binary Tree

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。常用算法有红黑树、AVLTreap、伸展树等。在平衡二叉搜索树中,我们可以看到,其高度一般都良好地维持在Olog2n),大大降低了操作的时间复杂度。

 

红黑树

红黑树是一种自平衡二叉查找树

红黑树,通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,红黑树可以保证没有一条路径会比其他路径长出2倍以上,所以称之为平衡。为了保持平衡,红黑树要满足以下五条性质:

 

1、每个节点不是红色就是黑色的。

2、根结点是黑色的。

3、每个叶节点(nil)是黑色的,实际上nil只有一个。

4、如果一个节点是红色的,则它的两个子节点都是黑色的。

5、对每个节点,从该节点到其所有后代叶结点的简单路径上,均包含相同数目的黑色节点。

 

所有性质1-5合起来约束了该树的平衡性能--即该树上的最长路径不可能会大于2倍最短路径

 

红黑树和平衡二叉树区别如下:

1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。

2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

 

2.当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质。
为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树种某些结点的颜色及指针结构,以达到对红黑树进行插入、删除结点等操作时,红黑树依然能保持它特有的性质。

二叉树 PK 哈希 PK 链表

哈希 时间复杂度 O(1)

二叉树的时间复杂度  <= 链表

平衡二叉树:二叉树支持动态的插入和查找,好的算法可以在O(log2 n)

 

场景:

1.key value

2.数据本身就不能哈希时.(如某类型只定义了相等,大于,小于三个操作时......)

 

Erlang 里面的一些key value

lists: [{key(), value()}]    : 链表

Proplists              : lists模块实现

Dict                         :哈希

Orddict :lists模块实现

gb_trees              :平衡二叉树

ets set, bag ,duplicate_bag  :哈希

      ordered_set            :平衡二叉树

process dictionary :哈希


 

 

 

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值