一起刷LeetCode——数据结构

81 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

前言

  • 面临着当前不太乐观的就业环境,更凸显出个人硬实力的重要。而评判个人硬实力主要在于是否能解决问题,但是随着越来越多的面经的出现,好像解决的问题都成为了所谓的算法题,个人认为是不完全正确的。算法只是一方面,还有一方面就是数据结构,数据结构和算法是相辅相成的,算法是解决问题的方法和思路,而数据结构是承载算法的基础,某些算法只能用在特定的数据结构之上。而且有时候问题的解决仅仅是选对数据结构据就可以实现,因此,作为承载算法的基础,先大体梳理一下数据结构。

分类

  • 数据结构怎么分?见仁见智,我倾向于的分类是线性和非线性

PS:什么是线性? 线性和非线性是来自数学领域的术语,如果两个不同因素的组合作用只是两个因素单独作用的叠加,这种关系或特性就是线性的,如果一个微小的因素能够导致无法衡量的结果,这种关系或特性就是非线性的。

非受限线性表

顺序结构

  • 数组
    • 支持O(1)的随机访问
    • 平均O(n)的插入和删除

链式结构

  • 单链表
    • 不支持随机访问,如果要访问某个结点需要遍历
    • O(1)的插入和删除,因为插入和删除的时候,只需要移动指针
    • 每个结点需要额外的空间存指针,因此花费的内存比数组大

受限线性表

  • FILO
  • 顺序或者链式都可以实现
  • 常见问题:括号匹配

  • 最大堆
    • 堆顶结点的值最大
  • 最小堆
    • 经过排序的堆
    • 不是叶子结点的结点的值,不大于其左子结点和右子结点的值
  • 常见问题:k个元素中,找第N大的元素

队列

  • 普通队列
    • FIFO
    • 顺序或者链式都可以实现
  • 双边队列
    • 入口和出口都可以进队出队
  • 优先级队列
    • 根据优先级出队
  • 常见问题:LRU Cache

二叉树

  • 二叉树
    • 每个父节点有不超过2个子结点
    • 遍历方式
      • 广度优先
      • 深度优先
        • 前序
        • 中序
        • 后序
  • 完全二叉树
    • 一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
    • 是二叉树的一种特殊形态
  • 满二叉树
    • 二叉树的结点要么是叶子结点,要么它有两个子结点,是完全二叉树的特殊形态
  • 二叉搜索树
    • 左子树结点的值小于根结点的值,当右子树不为空时,右子树结点的值均大于根节点的值
  • 平衡二叉搜索树
    • 任何结点的左子树和右子树高度最多相差1
    • 红黑树
      • 自平衡二叉查找树
      • 平衡二叉搜索树的特殊形态,左子树和右子树的高度差可能大于1

哈夫曼树

  • 是带权路径长度最短的树,权值较大的结点离根较近
  • 常见问题:计算机内编码

字典树

  • 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较

总结

  • 通过梳理数据结构,我们可以选择使用更合适的数据结构,更小的时间复杂度和空间复杂度来更好的解决问题,这个可能也能解决部分优化问题
  • 今天也是有收获的一天