数据结构与算法(一)

数据结构是⼯具,算法是通过合适的⼯具解决特定问题的⽅法

(一)数据结构的存储⽅式 (源自labuladong)

1、底层结构

  • 底层存储是数组(顺序存储)和链表(链式存储)
  • 散列表、栈、队列、堆、树、图等等各种数据结构可以通过数组(顺序存储)或者链表(链式存储)实现

2、二者优缺点

(1) 数组
  • 优点:紧凑连续存储,可以随机访问,通过索引快速找到对应元素,⽽且相对节约存储空间
  • 缺点:因为连续存储,内存空间必须⼀次性分配够,所以说数组如果要扩容,需要重新分配⼀块更⼤的空间,再把数据全部复制过去,时间复杂度 O(N);⽽且你如果想在数组中间进⾏插⼊和删除,每次必须搬移后⾯的所有数据以保持连续,时间复杂度 O(N)。
(2) 链表
  • 优点:元素不连续,⽽是靠指针指向下⼀个元素的位置,所以不存在数组的扩容问题;如果知道某⼀元素的前驱和后驱,操作指针即可删除该元素或者插⼊新元素,时间复杂度 O(1)
  • 缺点:因为存储空间不连续,⽆法根据⼀个索引算出对应元素的地址,所以不能随机访问;⽽且由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间

3、其他数据结构的存储方式

「队列」、「栈」
  • ⽤数组实现,就要处理扩容缩容的问题
  • ⽤链表实现,没有这个问题,但需要更多的内存空间存储节点指针
「图」
  • 邻接矩阵就是⼆维数组。邻接矩阵判断连通性迅速,并可以进⾏矩阵运算解决⼀些问题,但是如果图⽐较稀疏的话很耗费空间。
  • 邻接表就是链表。邻接表⽐较节省空间,但是很多操作的效率上肯定⽐不过邻接矩阵。
「散列表」
  • 通过散列函数把键映射到⼀个⼤数组。对于解决散列冲突的⽅法
  • 线性探查法就需要数组特性,以便连续寻址,不需要指针的存储空间,但操作稍微复杂些
  • 拉链法需要链表特性,操作简单,但需要额外的空间存储指针
「树」
  • ⽤数组实现就是「堆」,因为「堆」是⼀个完全⼆叉树,⽤数组存储不需要节点指针,操作也⽐较简单;
  • ⽤链表实现就是很常⻅的那种「树」,因为不⼀定是完全⼆叉树,所以不适合⽤数组存储(在这种链表「树」结构之上,⼜衍⽣出⼆叉搜索树、AVL 树、红⿊树、区间树、B 树等等,以应对不同的问题)

(二)树

1、树的分类

数据结构与算法(一)_第1张图片

(1) 按照有序性,可以分为有序树和无序树:
  • 无序树:树中任意节点的子结点之间没有顺序关系
  • 有序树:树中任意节点的子结点之间有顺序关系
(2) 按照节点包含子树个数,可以分为B树和二叉树
二叉树可以分为以下几种:
  • 二叉树:每个节点最多含有两个子树的树称为二叉树;
  • 二叉查找树:首先它是一颗二叉树,若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树;
  • 满二叉树:叶节点除外的所有节点均含有两个子树的树被称为满二叉树;
  • 完全二叉树:如果一颗二叉树除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布
  • 霍夫曼树:带权路径最短的二叉树。
  • 红黑树:红黑树是一颗特殊的二叉查找树,每个节点都是黑色或者红色,根节点、叶子节点是黑色。如果一个节点是红色的,则它的子节点必须是黑色的。
  • 平衡二叉树(AVL):一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

2、二叉树的遍历

(1) 前中后序是遍历⼆叉树过程中处理每⼀个节点的三个特殊时间点,绝不仅仅是三个顺序不同的List:数据结构与算法(一)_第2张图片
  • 前序位置的代码在刚刚进⼊⼀个⼆叉树节点的时候执⾏; (根节点-左儿子-右儿子)
  • 后序位置的代码在将要离开⼀个⼆叉树节点的时候执⾏; (左儿子-根节点-右儿子)
  • 中序位置的代码在⼀个⼆叉树节点左⼦树都遍历完,即将开始遍历右⼦树的时候执⾏。 (左儿子-右儿子-根节点)
(2) 思路
  • 只要涉及递归的问题,都是树的问题;实很多动态规划问题就是在遍历⼀棵树
  • 是否可以通过遍历⼀遍⼆叉树得到答案?如果不能的话,是否可以定义⼀个递归函数,通过⼦问题(⼦树)的答案推导出原问题的答案?
  • 第一类:遍历一遍二叉树得出答案——回溯算法(可能要借助辅助函数和外部变量)数据结构与算法(一)_第3张图片
  • 第二类:通过分解问题计算出答案——动态规划核
    数据结构与算法(一)_第4张图片

3、二叉树的创建

  • 从前序、中序构建
  • 从中序、后序构建
  • 递归
  • 非递归

4、二叉树的序列化和反序列化(serialize 和 deserialize )

  • 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境
  • 采取相反方式重构得到原数据。

你可能感兴趣的:(系统工程师面试,c++,面试)