数据结构笔记



一、数据结构是什么?

数据结构就是已某种特定方式存储数据,按某种结构把数据结构化然后存储到内存容器当中。

二、我们为什么需要数据结构?

结构化存储可以让数据有不同的形态,我们通过构造多种结构来解决数据的增、删、改、查的效率问题,有的结构增删效率高,有的结构查效率高,所以我们需要数据结构来解决不同的问题。

三、数据结构的分类?数据结构的种类?

**数据结构分类**
==按逻辑结构分==
1、集合结构
2、线性结构
3、树形结构
4、图形结构
==按物理存储结构分==
1、顺序存储结构
2、链式存储结构
==按种类分==
  1. 数组
  2. 链表
  3. 符号表
  4. 队列

数组

在内存中顺序存储,线性结构,也就是说在内存中存储是有序的,所以数组结构是有索引的,但是做增删的时候需要移动大量数据,影响效率
特点:
查询效率高,增删影响效率
分类:
一维数组、二维数组

链表

在内存中链式存储,线性结构,元素在内存中是无序的,但是每个元素内部有指针指向下一个元素,所以查询的时候只能挨个查询,做增删只需要改变元素的指针指向即可。
特点:
增删效率高、查询效率低
分类:
单向链表、双向链表(一个元素的指针既可以指向后一个元素,同时又可以指向前一个元素)
问题:
有环链表、快慢指针问题、约瑟夫问题

根据选择可由数组或者链表实现,线性结构,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+树的非子节点不保存元素,只保存元素的索引,所以只有叶子节点保存元素,这样就形成了一个有序链表,但是这个链表是有索引的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值