一、数据结构是什么?
数据结构就是已某种特定方式存储数据,按某种结构把数据结构化然后存储到内存容器当中。二、我们为什么需要数据结构?
结构化存储可以让数据有不同的形态,我们通过构造多种结构来解决数据的增、删、改、查的效率问题,有的结构增删效率高,有的结构查效率高,所以我们需要数据结构来解决不同的问题。三、数据结构的分类?数据结构的种类?
**数据结构分类**==按逻辑结构分==
1、集合结构
2、线性结构
3、树形结构
4、图形结构
==按物理存储结构分==
1、顺序存储结构
2、链式存储结构
==按种类分==
- 数组
- 链表
- 栈
- 堆
- 符号表
- 树
- 图
- 队列
数组
在内存中顺序存储,线性结构,也就是说在内存中存储是有序的,所以数组结构是有索引的,但是做增删的时候需要移动大量数据,影响效率特点:
查询效率高,增删影响效率
分类:
一维数组、二维数组
链表
在内存中链式存储,线性结构,元素在内存中是无序的,但是每个元素内部有指针指向下一个元素,所以查询的时候只能挨个查询,做增删只需要改变元素的指针指向即可。特点:
增删效率高、查询效率低
分类:
单向链表、双向链表(一个元素的指针既可以指向后一个元素,同时又可以指向前一个元素)
问题:
有环链表、快慢指针问题、约瑟夫问题
栈
根据选择可由数组或者链表实现,线性结构,pop弹栈,push压栈特点:
先进后出、后进先出
问题:
括号匹配问题、逆波兰表达式问题
堆
由树与数组实现,线性结构与树结构的合成问题:
堆排序
符号表
以键值对形式存储数据。特点:
键唯一,值不唯一
树
树可以由数组实现或者链表实现,但是呈树形结构 特点:一棵树有一个父节点,父节点也叫做根节点,根节点可以由多个子节点,最下面的子节点叫叶子节点。
分类:
二叉树、平衡树、平衡二叉树、2-3树、红黑树、B-树、B+树
图
图是一组以网络形式相互连接的节点。节点也称为顶点。 一对节点(x,y)称为边(edge),表示顶点x连接到顶点y。边可以包含权重/成本,显示从顶点x到y所需的成本分类:有向图、无向图、加权有向图、加权无向图
遍历方式:广度优先、深度优先
问题:畅通工程、拓扑排序、prim算法实现最小生成树、kruskal算法实现最小生成树、松弛技术、Dijkstra算法实现最短路径
队列
可用数组或者链表实现,线性结构特点:
先进先出
分类:
最小优先队列、最大优先队列、索引最小优先队列、所以最大优先队列
四、常见的排序规则有哪些?
- 冒泡排序
- 插入排序
- 选择排序
- 希尔排序
- 归并排序
- 快速排序
- 堆排序
- 基数排序
五、在一个给定的从1到100的整型数组中,如何快速找到缺失的数字?
可以先通过排序算法对这100个数字进行排序,然后再遍历这100个数字,判断当前迭代变量i是否等于数组中的arr[i]值。六、数组和链表的区别
存储结构分:数组是顺序存储结构,在内存当中是有顺序的,链表是链式存储结构,在内存中是没有顺序的,但是他们的指针指向下一个元素,物理结构分二者都是线性结构。通过特性区分:数组索引查询,查询效率高,但是增删伴随了大量的元素移动所以效率低(因为数组长度是固定的),链表通过指针查询下一个数据,只能挨个查询,查询效率低,但是增删只需要修改指针的方向,所以增删效率高,各有各的优缺点,应根据情况选择使用。
七、简述快速排序的过程
快速排序是基于冒泡排序的改进版,它的时间复杂度是:最坏情况O(n^2),最好情况O(nlogn),首先寻找基准元素,一般在数组头或者数组尾部寻找,通过该基准元素将整个数组分为两个部分,一边大一边小,再从这两个部分中寻找基准元素,寻找出两个基准元素对两组数据进行分割,分割成四份,再一次类推,直到元素被分成单个不可再分,然后再进行排序,该方式成为分治。八、算法的稳定性是什么?
在一组数据中有多个相同的元素,此时每个相同元素都有互相对应的顺序,通过排序,这些元素都还保存在相对的顺序,并没有被打乱,那就说明该元素是具有稳定性的。具有稳定性: 冒泡排序、插入排序、归并排序
不具有稳定性: 选择排序、希尔排序、快速排序
九、排序算法的选择准则
通过三个方面来进行选择:稳定性、元素个数n的大小、内存大小、数据是否较为有序。
快速排序: 适合较均匀的元素、数据量大的数据,速度很快,但是丢失了稳定性。
归并排序: 适合大量数据,但是速度欠与快速排序,但是有了稳定性。
希尔排序: 和归并排序类似,没有稳定性。
堆排序: 用于处理大量数据,对内存要求高。
插入排序: 适合较小数据量,在有序的情况下,排序效率较高,但是没有稳定性。
选择排序: 适合较小数据两,具有稳定性。
冒泡排序: 一般不直接使用。
十、邻接矩阵和邻接表的区别?
邻接矩阵是是通过二维数据实现,可以快速的查询并增删图的元素,但是要求空间大,邻接表示通过数组+队列/链表实现,速度较慢于邻接矩阵,但是占用空间小。十一、用循环比用递归的效率高吗?
二者在效率方面是没有绝对高低之分的,但是递归不能解决层次太深问题,并且对栈是有要求的,且套太深会导致栈内存溢出异常,循环速度快,结构简单,但对于一些问题只适用于递归解决。十二、解决哈希冲突的方法
- 线性探测法
- 平方探测法
- 伪随机序列法
- 拉链法
十三、B树与B+树的区别
B树的特性如下:
B树又称为M阶树,M代表一个节点可以存储多少数据,一般存储的最大数据为M-1个键值对,一个元素的子节点最多只能有M个,根节点至少有两个子节点。
B+树在B树的特性上新增了特性,B+树只有叶子节点才存储数据,其余节点都存储数据的索引,树的所有叶子节点构成一个有序链表。
十四、树的特性
树是已树状结构排列元素的数据结构,有一个根节点,每个根节点有多个子节点,子节点下又有子节点,但是每个子节点只有一个唯一的父节点,最底下的子节点叫做叶子节点,树的高度是叶子节点到根节点经历的边数。
十五、二叉树的特性
二叉树拥有数的基本特性,但是二叉树的每个父节点规定只能有两个子节点,分别为左子结点和右子节点。
十六、二叉查找树的特性
二叉查找树又叫做二叉搜索树,也叫做排序二叉树,它要求二叉树是有序的,那么保证它有序的条件是:左子节点一定小于父节点,右子节点一定大于父节点,因此可以得出左子节点小于右子节点,有了这一层关系之后,就可以通过递归查找。
十七、AVLTree的特性
AVLTree又叫做平衡二叉树,它拥有二叉查找树的特性,它要求左子节点和右子节点的高度差不能大于1,要求接近高度平衡而不是绝对平衡,因此它需要通过左旋或者右旋来调整平衡,查找、插入和删除在平均和最坏情况下都是O(log n)。
十八、红黑树
红黑树和VALTree十分相似,都是二叉树,也都需要通过自旋来调整树的平衡,但是AVLTree要求高度平衡,而红黑树只需要大概平衡,它需要左子节点的高度不能相差于右子节点的2倍,一旦其高度相差超过两倍那么需要自旋调整平衡,红黑树还有其他特性如下:
- 红黑树的元素非红即黑
- 红黑树的根节点和叶子节点必须为黑色
- 如果当前节点为红色,那么不允许当前节点的父节点或者子节点为红色(不能连续出现两个红色节点)
- 每一个从根节点到叶子节点的路径上的黑色节点数量必须相同
十九、2-3树的特性
2-3树不同于二叉树,二叉树只能有两个子节点,而2-3树最多可以有三个子节点,二叉树每个节点只能有一个值(或键值对),2-3树最多可以有3个值,但是一旦发生存储了3个值(插入值是和二叉树一样的,大的放在左边,小的放在右边,注意:只有在叶子节点插入值时才不会向下延伸,只会在叶子节点当中直接插入该值),那么该节点则会发生改变,该节点会将三个值最中间的值提升为父节点,并将两侧是指提升为该父节点的左右子节点,可以看出,2-3树是向上生长的树,那么他们的叶子节点高度一致,属于绝对平衡树。
二十、B树的特性
B树是从2-3树中伸展出来的,和2-3不同的是,它一个节点可以保存M个值,这个M自定义,所以我一般将B树叫做M阶B树,M阶B树特性如下:
- 每个节点最多有M-1个值,如果超过则向上生长
- 每个父节点只能有M个子节点
- 根节点的子节点不能少于2个
二十一、B+树的特性
B+树和B树十分相似,不同点在于B+树的非子节点不保存元素,只保存元素的索引,所以只有叶子节点保存元素,这样就形成了一个有序链表,但是这个链表是有索引的。