校招准备系列7-数据结构

线性表定义:
  1、0个或多个元素的集合
  2、元素之间是有序的
  3、元素个数有限
  4、元素数据的类型必须相同

顺序表:线性表的顺序存储结构
链表:线性表的链式存储

链表

链表是一种由节点(Node)组成的线性数据集合,每个节点通过指针指向下一个节点。它是一种由节点组成,并能用于表示序列的数据结构。

  • 单链表:每个节点仅有一个指针指向下一个节点,最后一个节点指向空(null)。
  • 双链表:每个节点有两个指针p,n。p指向前一个节点,n指向下一个节点;最后一个节点指向空。
  • 循环链表:每个节点指向下一个节点,最后一个节点指向第一个节点。
  • 时间复杂度:
    索引:O(n)
    查找:O(n)
    插入:O(1)
    删除:O(1)

栈是一个元素集合,支持两个基本操作:push用于将元素压入栈,pop用于删除栈顶元素。
后进先出的数据结构(Last In First Out, LIFO)

  • 时间复杂度
    索引:O(n)
    查找:O(n)
    插入:O(1)
    删除:O(1)

队列

队列是一个元素集合,支持两种基本操作:enqueue 用于添加一个元素到队列头,dequeue 用于删除队列尾的一个元素。
先进先出的数据结构(First In First Out, FIFO)。

  • 时间复杂度
    索引:O(n)
    查找:O(n)
    插入:O(1)
    删除:O(1)

二叉树

二叉树是一个树形数据结构,每个节点最多可以有两个子节点,称为左子节点和右子节点。

  • 满二叉树(Full Binary Tree):每一个层的结点数都达到最大值(国内定义);二叉树中的每个节点有 0 或者 2 个子节点(国外定义)。

  • 完全二叉树:二叉树中除最后一层外其他各层的节点数均达到最大值,最后一层的节点都连续集中在最左边。

  • 完美二叉树(Perfect Binary Tree):二叉树中的每个节点有两个子节点,并且所有的叶子节点的深度是一样的。

  • 二叉树的遍历:
    – 先序遍历:根左右。非递归方法:用一个辅助栈
    – 中序遍历:左根右
    – 后序遍历:左右根
    已知先序遍历序列和中序遍历序列,求出后序序列 或者 已知中序序列和后序序列,求出先序遍历。但是不能由先序遍历序列+后序遍历序列求出中序遍历序列。

二叉树的度数和节点数的关系

  • 总度数(从上往下找边的总数)= 节点数-1(从下往上找边的总数)
    2*n2+n1 = n2 + n1 + n0 - 1

二叉查找树

二叉查找树(BST)是一种二叉树。其任何节点的值都大于等于左子树中的值,小于等于右子树中的值。

  • 时间复杂度
    索引:O(log(n))
    查找:O(log(n))
    插入:O(log(n))
    删除:O(log(n))

字典树trie

字典树,又称为基数树或前缀树,是一种用于存储键值为字符串的动态集合或关联数组的查找树。树中的节点并不直接存储关联键值,而是该节点在树中的位置决定了其关联键值。一个节点的所有子节点都有相同的前缀,根节点则是空字符串。

树状数组

树状数组,又称为二进制索引树(Binary Indexed Tree,BIT),其概念上是树,但以数组实现。数组中的下标代表树中的节点,每个节点的父节点或子节点的下标可以通过位运算获得。数组中的每个元素都包含了预计算的区间值之和,在整个树更新的过程中,这些计算的值也同样会被更新。

  • 时间复杂度
    区间求和:O(log(n))
    更新:O(log(n))

堆是一种基于树的满足某些特性的数据结构:整个堆中的所有父子节点的键值都满足相同的排序条件。堆分为最大堆和最小堆。在最大堆中,父节点的键值永远大于等于所有子节点的键值,根节点的键值是最大的。最小堆中,父节点的键值永远小于等于所有子节点的键值,根节点的键值是最小的。

  • 时间复杂度
    索引:O(log(n))
    查找:O(log(n))
    插入:O(log(n)):新节点在最右下的位置,作为叶子节点,上浮到合适位置
    删除:O(log(n)):删除堆顶元素。用最后一个节点替换根节点,从根节点自上而下进行堆调整。
    删除最大值/最小值:O(1)

哈希

哈希用于将任意长度的数据映射到固定长度的数据。哈希函数的返回值被称为哈希值、哈希码或者哈希。如果不同的主键得到相同的哈希值,则发生了冲突。
Hash Map:hash map 是一个存储键值间关系的数据结构。HashMap 通过哈希函数将键转化为桶或者槽中的下标,从而便于指定值的查找。

  • 冲突解决
    链地址法(Separate Chaining):在链地址法中,每个桶(bucket)是相互独立的,每一个索引对应一个元素列表。处理HashMap 的时间就是查找桶的时间(常量)与遍历列表元素的时间之和。
    开放地址法(Open Addressing):在开放地址方法中,当插入新值时,会判断该值对应的哈希桶是否存在,如果存在则根据某种算法依次选择下一个可能的位置,直到找到一个未被占用的地址。开放地址即某个元素的位置并不永远由其哈希值决定。线性探测,二次探测,随机探测等。

并查集

http://dongxicheng.org/structure/union-find-set/

AVL树与红黑树

红黑树

https://blog.csdn.net/ivan_zgj/article/details/51504764
红黑树树是一种二叉搜索树。性质:
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3 每个叶节点(NIL节点,空节点)是黑色的。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

插入的节点是红色,至多2次旋转。删除至多3次旋转。

AVL树

AVL树是一种二叉搜索树,每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1,是严格平衡的。查找、插入、删除操作的复杂度都是O(logn)

红黑树也是一种二叉搜索树,从根到叶子的最长的可能路径不多于(<=)最短的可能路径的两倍长,因此它只是大致平衡的。查找、插入、删除操作的复杂度都是O(logn)

所以红黑树的统计性能要优于AVL树。

http://www.cnblogs.com/skywang12345/p/3245399.html

B树和B+树

https://www.cnblogs.com/vincently/p/4526560.html

https://www.sohu.com/a/156886901_479559

B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。”

B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间/范围查找和遍历。

猜你喜欢

转载自blog.csdn.net/peopleqinlei/article/details/82956925