array

与那些破坏性(动态改变变量的值)语言相比,erlang array 没有固定的时间插入和查找,所以效率不高,在实践中很少使用。
array以tuple-tree实现:

-record(array, {size,         %% number of defined entriesmax,          %% maximum number of entriesdefault,      %% the default value (usually 'undefined')elements      %% the tuple tree
}).

proplists

适用数据量较少的场景,处理配置文件和函数选项时常用,proplists对内部数据结构是Key-Value键值对形式,第一个元素做key用来查询和删除,如果一个key有多个值就会使用第一次出现的值,其它被忽略。Key进行比较使用的是=:=精确等于,会判断类型和值。

orddict

用List实现的有序Dictionary,orddict按照Key进行排序,Key值不重复(对比一下proplists).每一次增加新数据项都会进行重新排序,所以通常情况查找会非常快。由于也是List和tuple实现,所以和proplists一样orddict也不适合大数据量的情况(LYSE上提到orddict在复杂性和效率上达到折中,元素最好不要超过75个)。注意orddict进行Key比较使用的是相等(==)。通过模块暴露出来的接口完成对orddict的处理,不要当作普通的list直接处理,因为一些操作会涉及到重排序。

dict

动态哈希表实现的字典。在接口上和orddict保持一致,在实现上和array动态扩展的思路类似, 与proplists,orddict相比它能够支持更大的数据量,你可以在数据量膨胀的时候从orddict转为dict。

gb_trees

(General Balanced Trees) 通用二叉查找树,通常被用作有序字典。与普通未平衡二叉树相比没有额外的储存开销,这里所说的额外的存储开销是指是否使用额外的metadata记录节点相关的信息,dict和array的实现就使用了这样的描述信息,换句话说gb_trees是自描述的,性能优于平衡二叉树(AVL trees)。与proplists,orddict相比它能够支持更大的数据量
gb_trees的数据结构:

gb_trees = {Size, Tree}
Tree = {Key, Value, Smaller, Bigger} | nil
Smaller = Tree
Bigger = Tree

ordsets

lists实现的有序集合。由于数据元素的变动都会触发重新排序,所以ordsets效率不高,只适用于数据量比较小的场景。ordsets中包含了常见的集合操作:求交集,并集,是否为子集,是否存在交集。

sets

提供了和ordsets一样的接口,它的实现和dict类似,只是存储的数据元素从键值对变成了值,支持更大的数据量,与dict一样特别适用于读密集的场景,比如判断一个元素是否在集合中。

gb_sets

包含了ordsets和gb_trees所提供的接口,gb_setsgb_trees实现类似,只是存储的数据元素从键值对变成了值。gb_sets与sets相比除了读操作性能差一些,其它操作都更快gb_sets实现了sets和ordsets相同的接口,并新增了一些方法。
实际应用中你会看到绝大多数时候都是在使用gb_sets,需要=:=比较的时候使用sets

queue

queue使用两个list来实现,这两个List为{RearList,FrontList},即{尾端,前端},queue的第一个元素出现在FrontList的Head;queue的最后一个元素出现在RearList的Head。
它的内部实现充分考虑到了效率,queue模块中除了len/1, join/2, split/2, filter/2 and member/2复杂度是O(n)之外所有的操作的复杂度都在O(1)(一般情况是O(1),如调用出队接口,当前端list为空时,时间为O(length(RearList)))。

map

map数据结构的复杂性和进程字典(put,get)相比都简单很多, 所以map第一天设计就不是为了大量存放kv数据的目的,它的目的是提供一种更好的record的替代品,在细节上改进:支持atom以外的key, 语法和语义更自然。如果要性能,请使用ets,dict 等数据结构,如果要替代record用的更顺手,用map


性能相关

lists:substract(A,B),该操作的复杂度和leng(A)*length(B)成正比,当参与运算的两个都是长列表的时候就会非常慢了;使用ordsets会好很多:

%% 不要这样做: lists:subtract(A, B) is equivalent to A -- B.%% 替代方案:
HugeSet1 = ordsets:from_list(HugeList1),
HugeSet2 = ordsets:from_list(HugeList2),
ordsets:subtract(HugeSet1, HugeSet2)%% 显然lists中的元素原始顺序非常重要上面的方法就不适用了,要保持数据原始顺序,可以这样做:
Set = gb_sets:from_list(HugeList2),
[E || E <- HugeList1, not gb_sets:is_element(E, Set)]

两个细节:

  1. 如果lists中包含重复的元素时,两种运算不是等价的,HugeList2会移除所有在HugeList1中出现的元素。
  2. 下面的方法比较lists中的元素使用的是相等== 而’–‘操作使用的是匹配操作符’=:=';如果这个地方要求苛刻的话,可以使用sets替换为gb_sets,但要注意sets:from_list/1要比gb_sets:from_list/1慢得多.

关于查找算法

数组寻址容易,插入和删除困难;链表寻址困难,插入和删除容易;哈希表插入和删除的时间均取决于查找时间.哈希表在数据和数据存储位置之间建立了确定的函数关系,所以获得了高效的查询效率,而线性表和树,数据项在结构中的位置是随机的,和数据项取值没有确定的关系,这种结构上进行查找数据项是基于"比较",查找效率依赖比较次数。


关于iolist
http://www.cnblogs.com/me-sa/archive/2012/01/31/erlang0034.html

关于binary
http://www.cnblogs.com/me-sa/archive/2011/12/25/erlang0024.html

Erlang数据结构相关推荐

  1. Erlang程序设计笔记---(第三节 Erlang的基本概念)

    Erlang的基本概念 一. 简单的整数运算 Erlang遵循算术表达式的一般规则 Erlang可以用任意长度的整数执行整数运算.在Erlang里,整数运算是精确的,因此无需担 心运算溢出或无法用特定 ...

  2. Erlang/OTP并发编程实战

    <Erlang/OTP并发编程实战> 基本信息 原书名:Erlang and OTP in Action 作者: (美)洛根(Logan,M.) 梅里特(Merritt,E.) (瑞典) ...

  3. 【Erlang/OTP入门】基于进程的并发编程和分布式

    引言 在参加区统考的前一天开始写这篇文章,开学后时间真的紧迫了很多.   我最近玩Erlang只是一个偶然(?).这一切的开始是我某天看到一本名为<Erlang and OTP in Actio ...

  4. mysql killed进程不结束_优秀的数据库产品——MySQL 云数据库服务

    作为一种低成本,高性能,高可靠性和开放源代码的数据库产品,MySQL已在Internet公司中广泛使用. 例如,淘宝有数千个MySQL服务器. 尽管NoSQL在过去两年中发展迅速,新产品层出不穷,但N ...

  5. Erlang的散列数据结构

    介绍Erlang的dict模块( dictionary),dict就是一个通过散列(hash)来存放数据的组织方式,同时dict模块还提供了完整的操作接口,类似的模块还有orddict模块.具体讲如何 ...

  6. Erlang服务端开发(无需Erlang基础)笔试题

    某游戏公司Erlang服务端开发(无需Erlang基础)笔试题,面向C/C++程序员 一.用你熟悉的语言解决下面的问题. 1.反转输出字符串,并移除其中的空格. 2.快速的判断一个数是否素数的方法. ...

  7. 基于Erlang语言的视频相似推荐系统 | 深度

    作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) [导语]:作者在上一篇文章<基于内容的推荐算法>中介绍了基于内容的推荐算法的实现原理.在本篇文 ...

  8. Erlang 数据类型。。

    2019独角兽企业重金招聘Python工程师标准>>> 数值 二进制串/位串 原子 元祖 列表 唯一标识符(pid,端口,引用) Fun 函数 Erlang 中的数据通常被称作项式 ...

  9. 通俗易懂的Redis数据结构基础教程

    Redis有5个基本数据结构,string.list.hash.set和zset.它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了. ...

最新文章

  1. Spring Cloud入门教程 - Zuul实现API网关和请求过滤
  2. 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★
  3. Visio studio 2019中opencv 4.1.1运行环境配置(亲测可用)
  4. 禁用当前的账户win7_拯救你的win7系统,电脑优化到位,打游戏才会流畅
  5. 《算法》练习题1.1.1--1.1.39 答案解析
  6. 如何通过使用注册项 (.reg) 文件添加、修改或删除注册表子项和值
  7. centos 6.5装mysql 5.7,centos 6.5装mysql5.7
  8. 团队开发里频繁使用 git rebase 来保持树的整洁好吗?
  9. 【ASP.NET 问题】IIS发布网站后出现 “处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误“的解决办法
  10. 7-2 温度转换 (5 分)
  11. EXCEL如何新建自定义单元格以及样式怎么设置
  12. Atitit php pdo的api使用 目录 1.1. PHP PDO简介 1 1.2. 若要使用数据库长连接,:PDO::ATTR_PERSISTENT 1 2. 其他设置 2 2.1. )、P
  13. bugzilla发送邮件慢的问题
  14. 计算机考试相关证书 (一)
  15. linux下模拟键盘的几种方法
  16. ImportError: cannot import name ‘_validate_lengths‘解决方法
  17. PostgreSQL小数修约
  18. 作为亚马逊小白卖家不建议盲目进入亚马逊市场
  19. 微信小程序——VW、VH
  20. 移动端vue调用照相机及相册

热门文章

  1. Android---RecyclerView网络请求图片加载
  2. 我的高德地图之定位,Marker,位置信息。
  3. 实时计算Flink+Hologres
  4. @kubernetes(k8s) 应用配置管理(ConfigMap、subPath、Secret)
  5. 7-4 求幂级数展开的部分和(20 分)
  6. DevOps团队绩效考核重点
  7. mysql修改初始化得到的密码
  8. javascript事件触发器
  9. 机器人对话常用语模板_世界首个机器人观音在岛国问世,请问AI开光还会远吗?...
  10. 简述封装vue组件的过程