Erlang数据结构
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_sets
和gb_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)]
两个细节:
- 如果lists中包含重复的元素时,两种运算不是等价的,HugeList2会移除所有在HugeList1中出现的元素。
- 下面的方法比较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数据结构相关推荐
- Erlang程序设计笔记---(第三节 Erlang的基本概念)
Erlang的基本概念 一. 简单的整数运算 Erlang遵循算术表达式的一般规则 Erlang可以用任意长度的整数执行整数运算.在Erlang里,整数运算是精确的,因此无需担 心运算溢出或无法用特定 ...
- Erlang/OTP并发编程实战
<Erlang/OTP并发编程实战> 基本信息 原书名:Erlang and OTP in Action 作者: (美)洛根(Logan,M.) 梅里特(Merritt,E.) (瑞典) ...
- 【Erlang/OTP入门】基于进程的并发编程和分布式
引言 在参加区统考的前一天开始写这篇文章,开学后时间真的紧迫了很多. 我最近玩Erlang只是一个偶然(?).这一切的开始是我某天看到一本名为<Erlang and OTP in Actio ...
- mysql killed进程不结束_优秀的数据库产品——MySQL 云数据库服务
作为一种低成本,高性能,高可靠性和开放源代码的数据库产品,MySQL已在Internet公司中广泛使用. 例如,淘宝有数千个MySQL服务器. 尽管NoSQL在过去两年中发展迅速,新产品层出不穷,但N ...
- Erlang的散列数据结构
介绍Erlang的dict模块( dictionary),dict就是一个通过散列(hash)来存放数据的组织方式,同时dict模块还提供了完整的操作接口,类似的模块还有orddict模块.具体讲如何 ...
- Erlang服务端开发(无需Erlang基础)笔试题
某游戏公司Erlang服务端开发(无需Erlang基础)笔试题,面向C/C++程序员 一.用你熟悉的语言解决下面的问题. 1.反转输出字符串,并移除其中的空格. 2.快速的判断一个数是否素数的方法. ...
- 基于Erlang语言的视频相似推荐系统 | 深度
作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) [导语]:作者在上一篇文章<基于内容的推荐算法>中介绍了基于内容的推荐算法的实现原理.在本篇文 ...
- Erlang 数据类型。。
2019独角兽企业重金招聘Python工程师标准>>> 数值 二进制串/位串 原子 元祖 列表 唯一标识符(pid,端口,引用) Fun 函数 Erlang 中的数据通常被称作项式 ...
- 通俗易懂的Redis数据结构基础教程
Redis有5个基本数据结构,string.list.hash.set和zset.它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了. ...
最新文章
- Spring Cloud入门教程 - Zuul实现API网关和请求过滤
- 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★
- Visio studio 2019中opencv 4.1.1运行环境配置(亲测可用)
- 禁用当前的账户win7_拯救你的win7系统,电脑优化到位,打游戏才会流畅
- 《算法》练习题1.1.1--1.1.39 答案解析
- 如何通过使用注册项 (.reg) 文件添加、修改或删除注册表子项和值
- centos 6.5装mysql 5.7,centos 6.5装mysql5.7
- 团队开发里频繁使用 git rebase 来保持树的整洁好吗?
- 【ASP.NET 问题】IIS发布网站后出现 “处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误“的解决办法
- 7-2 温度转换 (5 分)
- EXCEL如何新建自定义单元格以及样式怎么设置
- Atitit php pdo的api使用 目录 1.1. PHP PDO简介	1 1.2. 若要使用数据库长连接,:PDO::ATTR_PERSISTENT	1 2. 其他设置	2 2.1. )、P
- bugzilla发送邮件慢的问题
- 计算机考试相关证书 (一)
- linux下模拟键盘的几种方法
- ImportError: cannot import name ‘_validate_lengths‘解决方法
- PostgreSQL小数修约
- 作为亚马逊小白卖家不建议盲目进入亚马逊市场
- 微信小程序——VW、VH
- 移动端vue调用照相机及相册