数据结构与算法是基础知识了,一般涉及数据结构的增删改查,深入一点的可以估计增删改查的时间复杂度和空间复杂度。本文介绍另一种衡量数据结构的方式:空间占用。这种分类让我对数据结构有了一个全新的认识。

假如需要存储数据的信息论(香农之子)最低空间占用为Z个bit(其实就是原始数据的空间占用),那么对这些数据的一种表示(数据结构)可以根据其空间占用分成三类:空间占用逐渐增大。

(1)Implicit(隐式):占用 Z+O(1) bits,如 Z+3 bits

(2)Succinct(简洁):占用 Z+o(Z) bits,如 Z + lgZ bits

(3)Compact(紧凑):占用 O(Z) bits,如 2Z bits,1.1Z bits

这里可能会造成疑惑,Succinct 和 Compact 有啥区别,个人认为附加的空间只要和 Z 不是线性关系就是 Succinct,是线性关系就是 Compact。

空间占用 Implicit < Succinct < Compact。看一个比较形象的图:空间占用就是这些数据的围墙,实际建筑物占空间并不大,重点是围墙内的面积。这张图就很 Succinct 了。

下边通过例子来具体介绍:

Implicit 数据结构

普通数组:除了原始数据,只多存了一个数组长度。(和链表区分开,链表还有数据之间的指针)

以null结尾的字符串:除了原始字符数据,只多了一个 null 字符。

这些数据结构基本都是一些非常简单的数据结构,虽然空间占用很高效,但是如果不做特殊处理,在其上的操作复杂度都不低,查找都是O(n)的。当然也可以先将数据排序再存到数组里,也属于 implicit 数据结构。

为什么叫 implicit 呢,我觉得应该是原始数据中隐藏着结构,因为并没有用指针之类的明显表示数据之间的关系。

Succinct 数据结构

这种数据结构的定义是 Jacobson 1989 年左右提出来的。

链表就不是 Succinct 数据结构,在链表中每个数据都带一个指针,假如数据有 n 个,为了区分这n个数据,指针的长度最少为 lg(n)个 bit。比如要区分 4 个数据至少需要 2 个bits。这样假如每个数据占 x 个bit,Z=xn,指针占用 nlg(n)个,总占用 ( 1+x/lg(n) ) Z 个bits。Z 的一次项系数大于1。

Succinct的起源是用 Level-Ordered Unary Degree Sequence(LOUDS)编码将一棵普通的树形结构编码成 Succinct tree。

看下面这棵树(来自《Space-efficient Static Trees and Graphs》),其每个节点的编码是这样来的:如果其有 n 个子节点,那么他的编码就是 n 个 1 加一个 0。

接下来用一另一棵树介绍这些节点编码如何组织成一个数组:(为什么换个图呢,因为不是我画的,来自《SuRF: Practical Range  ery Filtering with Fast Succinct Tries》)。我们回过头来看 LOUDS 的名字,他是分层的,有序的。这些编码按层次从左到右依次排列,组成了 LOUDS 编码,如下图:

这样,就将一棵树编码成了一个数组。省掉了指针,但是这样怎么查找子节点或父节点呢?

在这个数组上提出了两个基本操作:

看不下去后边的等号公式可以不看,直接听我讲:

rank_q(x) 返回数组位置 x 之前(包括x)值为 q 的数据个数。比如位置 5 之前有几个 1 为 rank_1(5)。

select_q(x) 返回第 x 个 q 的数据位置。比如第 5 个 1 的位置为 select_1(5)。

那么,这两个操作如何实现节点的查找呢?首先一个节点是有多个 bit 编码的,由 0 分割。一般一个节点用它的起始位置 p 表示。节点的下标从 0 开始。

(1)第 i 个节点的位置:select_0(i)+1,即第 i 个0的位置 +1。

(2)起始位置为 p 的节点的 下标为 k 的子节点的位置:select_0(rank_1(p+k)) +1

(3)起始位置为 p 的节点的父亲节点的位置:select_1(rank_0(p))

看,他们搭配出来可以在数组里完成树的功能,这就是索引之美。

Compact 数据结构

我们常用的数据结构实现方式大部分都是 Compact 数据结构。需要用指针来记录数据的相对位置和关系。

如链表,用指针实现的树。

总结

树、堆等只是逻辑数据结构,是实现方式决定了其是 Succinct 还是 compact。而这个实现方式的区分一般就看他是用数组实现的还是用指针实现的,比如,树状数组就属于 Succinct,用链表实现的二叉树就是Compact。Implicit 数据结构基本都是基础数据结构,很难玩出花样,而Succinct 数据结构未来可能会有更多应用。

参考:

https://en.wikipedia.org/wiki/Succinct_data_structure

《SuRF: Practical Range  ery Filtering with Fast Succinct Tries》

《Space-efficient Static Trees and Graphs》

重新认识数据结构:从空间占用开始相关推荐

  1. linux磁盘空间df-h出不出来,linux 故障:df -h统计磁盘空间占用太多,但又du -h找不到大的文件...

    用lsof / | grep -i delete 从根目录定位打开的被删除的文件 如果定位到某文件占用空间很大 主要是因为我们在删除这个日志文件的时候是用rm -rf *.log这样的命令删除的,删除 ...

  2. iis worker process内存占用大_安卓模拟器磁盘空间占用大/内存空间不足

    长期使用模拟器.模拟器多开等问题,都会占用内存空间,久而久之就会出现内存空间不足.硬盘占用大的现象,可能会导致模拟器在运行中崩溃,游戏及应用闪退,模拟器卡顿等问题.如何解决硬盘空间占用大和内存不足的问 ...

  3. linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  4. 服务器磁盘空间占用,大文件查找

    记一次Linux服务器磁盘空间占用,大文件查找 du -h --max-depth=1 好久没写东西了,很久之前弄了个服务器玩玩,写了点东西在上面放着,一直在不停的抓数据,也就没怎么看,最近闲来无事登 ...

  5. 我的模型有多快?——深度学习网络模型的运算复杂度、空间占用和内存访问情况计算...

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 端午情浓,粽飘香 免费领取  定制珍贵品牌香粽 实物见下图,领取方式见本文末. 深度网络的计算 ...

  6. vsan Linux 网络磁盘,理解vSAN中的磁盘空间占用

    保存在vSAN存储中的虚拟机,在使用默认的虚拟机存储策略的情况下,会占用2倍多的空间.其中虚拟机硬盘实际占用2倍空间,其他还有交换文件.虚拟机配置文件等,这些也会占用一些空间,但相对虚拟机硬盘空间占用 ...

  7. linux 内核空间占用cpu百分比过高,线上linux系统故障排查之一:CPU使用率过高

    摘自: 一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. 下面我们将一步步定位问题,详尽的介绍每一步骤的相关知识. 一.通过top命令定位占用cpu高的进程 执行top ...

  8. Windows下最快磁盘空间占用分析工具(wiztree)使用指南

    今天给各位小伙伴们种草一款Windows操作系统下的"磁盘空间占用分析"的工具,名字叫"WizTree". 相信大家日常都遇到过磁盘空间占满.找大文件困难.线上 ...

  9. 两款好用的硬盘空间占用分析软件TreeSize Professional及FolderSizes绿色中文版 (绿色)

    [软件名]Folder Size Explorer [介   绍]这是一款免费文件夹大小查看器,可以使用不同的单位来显示里面文件夹或者文件的大小,这些单位包括 B.KB.MB 以及 GB.在手动找系统 ...

最新文章

  1. 利用MSER算法提取图像区域(车牌区域)的OpenCV代码~
  2. 【每周CV论文推荐】 初学深度学习图像分割必须要读的文章
  3. 如何配置charles_抓包工具--charles(青花瓷)及获取AppStore数据包
  4. 特稿 | OceanBase 连破纪录:蚂蚁技术人的砥砺前行
  5. 沉没成本(要不要买房)
  6. 【DP】晨练计划(ybtoj)
  7. 将一个文件夹的文件复制到另一个文件夹
  8. MATLAB(六)数据处理
  9. Hadoop--ip和主机名配置
  10. Objective-C 2.0 with Cocoa Foundation---对象的初始化以及实例变量的作用域(1)
  11. android studio拟器,十二、安装Android Studio 模拟器
  12. CSS常用基础效果---文字与图片并排+导航栏
  13. mac及idea常用快捷键
  14. AutoCad注册机使用方法
  15. 线性代数常用的公式LaTeX表示
  16. linux 拼音输出繁体_ubuntu输入法是繁体 寻找Ubuntu中繁体字输入法 - Linux - 服务器之家...
  17. IGRP原理及配置案例
  18. disallow .php,一次解决discuz只收录首页,不收录内页的问题,景安虚拟主机discuz帖子伪静态设置解决办法...
  19. Spring总结四:JDBC操作
  20. web服务 面试可能会问的问题

热门文章

  1. Apple2022春季发布会
  2. “人机结合”基金何以笑傲18年的“团灭行情”?
  3. 1032 挖掘机技术哪家强 python
  4. Mysql任意读取客户端文件,Mysql任意读取客户端文件
  5. java多重继承和多继承_多继承和多重继承
  6. 互联网时代的盈利模式
  7. QLabel实现双击事件
  8. 修改android 浏览器UA
  9. 【漆学军】MT4进阶到MT5速成之路(2)获取持仓
  10. 5、小型企业无线网部署(案例1)从客户需求来分析、规划、部署