常用数据结构

Posted catyuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用数据结构相关的知识,希望对你有一定的参考价值。

数据 -> 整理分析(算法 + 数据结构) -> 信息

  1. 基本数据类型(Primitive Data Type)
    标量数据类型(Scalar Data Type)
    整数、浮点数、布尔、字符
  2. 结构化数据类型(Structured Data Type)
    虚拟数据类型(Virtual Data Type)
    字符串、数组、指针、列表、文件
  3. 抽象数据类型(Abstract Data Type)
    堆栈
  • 数组 - Array / List(Python)
    Two-dimension 二维
  • 链表 - Linked List
    相同数据类型的数据,按特定顺序排列而成的线性表。
    链表中的数据项在计算机内存中的位置是不连续且随机(Random)存放的。
    Single Linked List 除非必要,否则不可移动链表头指针。
  • 堆栈 - Stack
    相同数据类型的组合 有序线性表 LIFO 抽象数据类型(ADT)
    1. 创建 create
    2. 入栈 push
    3. 出栈 pop
    4. 是否为空 isEmpty
    5. 是否已满 full
  • 队列
    FIFO ADT 有序线性表 抽象数据类型(ADT)
    广度优先搜索(BFS)
    堆栈只需要一个顶端(top),指针指向堆栈点顶端
    对列必须使用 front 和 rear 两个指针分别指向队列前端和队列尾端
    1. 创建 create
    2. 添加 add
    3. 删除 delete
    4. 返回前端的值 front
    5. 是否为空 empty
  • 树形结构
    二叉空间分割树(BSP tree)
    四叉树(Quadtree)
    八叉树(Octree)
    n 叉树(n-way)
    一棵合法的树,节点间可以互相连接,但不能形成无出口的回路。
    1. 度数(Degree):每个节点所有子树的个数。
    2. 层数(Level)
    3. 高度(Height):树的最大层数。
    4. 树叶/终端节点(Terminal Nodes):度数为 0 的节点。
    5. 父节点(Parent)
    6. 子节点(Children)
    7. 祖先(Ancestor)和子孙(Descendent)
    8. 兄弟节点(Siblings)
    9. 非终端节点(Nonterminal Nodes)
    10. 同代(Generation):在一棵树上具有相同层数的节点。
    11. 森林(Forest):n 棵(n ≥ 0)互斥树的集合。
    • 一般树形结构在计算机中的存储方式是以链表为主。对于 n 叉树来说,因为每个节点的度数都不相同,所以必须为每个节点预留存放 n 个链接字段的最大存储空间。
      这种 n 叉树特别浪费链接存储空间。假设 n 叉树有 m 个节点,那么此树共有 n*m 个链接字段。因此,除了树根外,每个非空连接都指向一个节点,所以得知空链接个数为 n*m - (m-1) = m*(n-1) + 1,而 n 叉树的链接浪费率为 [m*(n-1)+1]/m*n。因此得到一下结论:
      n=2 时,二叉树的链接浪费率约为 1/2。
      n=3 时,三叉树的链接浪费率约为 2/3。
      n=4 时,四叉树的链接浪费率约为 3/4。
      ... ...
      当 n = 2 时,浪费率最低,所以为了改善存储空间浪费的缺点,最常使用二叉树。
    • 二叉树 - Binary Tree / Knuth 树
      二叉树与一般树的区别:
      1. 树不可以为空集合,但二叉树可以
      2. 树的度数为 d≥0,但二叉树的节点度数为 0 ≤ d ≤ 2
      3. 树的子树间没有次序关系,二叉树则有
  • 图形结构
    树形结构描述节点间“层次”关系
    图形结构讨论两个顶点间”是否连通“
    加权图 ——“网络”
    • 欧拉环(Eulerian Cycle):当所有顶点的度数都是偶数时,才能从某顶点出发,经过每条边一次,再回到起点。
    • 偶拉链(Eularian Chain):从某一顶点出发,经过每条边一次,不一定回到起点,则只允许其中两个顶点的度数为奇数,其余则必须全部为偶数。
    • 有向图 (V1, V2)
    • 无向图 <V1, V2>
  • 哈希表
    • bucket(桶):哈希表中存储数据的位置,每一个位置对应到唯一的地址(bucket address),桶就好比一个记录。
    • slot(槽):每一个记录中可能包含好几个字段,而 slot 指的就是桶中的字段。
    • collision(碰撞):两个不同的数据,经过 Hash 函数运算后,对应到相同的地址。
    • 溢出:运算后的数据所对应到的 bucket 已满。
    • 哈希表:存储记录的连续内存。一种类似数据表的索引表格,可分为 n 个 bucket,每个 bucket 又可分为 n 个 slot。
    • 同义词(Synonym):两个标识符 I1 和 I2 经过哈希函数运算后所得的数值相同,即 f(I1) = f(I2),就称 I1 和 I2 对于 f 这个哈希函数是同义词。
    • 加载密度(Loading Factor):标识符的使用数量除以哈希表内槽的总数
      α(加载密度)= n(标识符的使用数目)/ [ s(每个桶内的槽数)* b(桶的数目)]
      α 值越大,表示哈希空间的使用率越高,碰撞或溢出的概率也越高。
    • 完美哈希(Perfect Hashing):没有发生碰撞和溢出的哈希函数。
    • 原则:
      1. 降低碰撞和移除的产生
      2. 哈希函数不宜过于复杂,越容易计算越好
      3. 尽量把文字键值转换成数字键值,方便计算
      4. 设计的哈希函数计算得到的值,均匀的分布在每一个桶中

以上是关于常用数据结构的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg常用库术语API数据结构总结

常用的大数据工具都有哪些?

数据库常用函数

Redis5种常用的数据结构

PostGIS常用的空间数据表的操作

SQL Server常用数据类型