- 数据结构
数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的,而对于其他操作则是低效的。需要理解各种数据结构,才能在处理实际问题时选取最合适的数据结构。
数据是计算机科学当中最关键的实体,而数据结构则可以将数据以某种组织形式存储,因此,数据结构的价值不言而喻。数据需要根据不同的场景,按照特定的格式进行存储。有很多数据结构能够满足以不同格式存储数据的需求。
- 常见的数据结构 -- 数组
数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。
每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将初始索引定义为零。
数组是可以在内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。
优点:
1、按照索引查询元素速度快
2、按照索引遍历数组方便
缺点:
1、数组的大小固定后就无法扩容了
2、数组只能存储一种类型的数据
3、添加,删除的操作慢,因为要移动其他的元素。
适用场景:
频繁查询,对存储空间要求不大,很少增加和删除的情况。
数组的基本操作:
Insert——在指定索引位置插入一个元素
Get——返回指定索引位置的元素
Delete——删除指定索引位置的元素
Size——得到数组所有元素的数量
面试中关于数组的常见问题:
1、寻找数组中第二小的元素
2、找到数组中第一个不重复出现的整数
3、合并两个有序数组
4、重新排列数组中的正值和负值
- 常见的数据结构 -- 栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
可以把栈想象成一列垂直堆放的书。为了拿到中间的书,你需要移除放置在这上面的所有书。这就是LIFO(后进先出)的工作原理。所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。
栈的基本操作:
Push——在顶部插入一个元素
Pop——返回并移除栈顶元素
isEmpty——如果栈为空,则返回true
Peek——返回顶部元素,但并不移除它
面试中关于栈的常见问题:
1、使用栈计算后缀表达式
2、对栈的元素进行排序
3、判断表达式是否括号平衡
- 常见的数据结构 -- 队列
队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队。
队列现实例子:售票亭排队队伍。如果有新人加入,他需要到队尾去排队,而非队首——排在前面的人会先拿到票,然后离开队伍。
队列的基本操作:
Enqueue()——在队列尾部插入元素
Dequeue()——移除队列头部的元素
isEmpty()——如果队列为空,则返回true
Top()——返回队列的第一个元素
面试中关于队列的常见问题:
1、使用队列表示栈
2、对队列的前k个元素倒序
3、使用队列生成从1到n的二进制数
- 常见的数据结构 -- 链表
链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
链表一般用于实现文件系统、哈希表和邻接表。
优点:
1、链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
2、添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;
缺点:
1、因为含有大量的指针域,占用空间较大;
2、查找元素需要遍历链表来查找,非常耗时。
适用场景:
数据量较小,需要频繁增加,删除操作的场景
链表的基本操作:
InsertAtEnd - 在链表的末尾插入指定元素
InsertAtHead - 在链接列表的开头/头部插入指定元素
Delete - 从链接列表中删除指定元素
DeleteAtHead - 删除链接列表的第一个元素
Search - 从链表中返回指定元素
isEmpty - 如果链表为空,则返回true
面试中关于链表的常见问题:
1、反转链表
2、检测链表中的循环
3、返回链表倒数第N个节点
4、删除链表中的重复项
- 常见的数据结构 -- 图
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
按照顶点指向的方向可分为无向图和有向图。
图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构。
常见图遍历算法:
1、广度优先搜索
2、深度优先搜索
面试中关于图的常见问题:
1、实现广度和深度优先搜索
2、检查图是否为树
3、计算图的边数
4、找到两个顶点之间的最短路径
- 常见的数据结构 -- 树
树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
-
- 每个节点有零个或多个子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树;
树形结构是一种层级式的数据结构,由顶点(节点)和连接它们的边组成。 树类似于图,但区分树和图的重要特征是树中不存在环路。
树形结构被广泛应用于人工智能和复杂算法,它可以提供解决问题的有效存储机制。
以下是树形结构的主要类型:
1、N元树
2、平衡树
3、二叉树
4、二叉搜索树
5、AVL树
6、红黑树
7、2-3树
面试中关于树结构的常见问题:
1、求二叉树的高度
2、在二叉搜索树中查找第k个最大值
3、查找与根节点距离k的节点
4、在二叉树中查找给定节点的祖先节点
- 常见的数据结构 -- 堆
堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:
-
- 堆中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki = k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),满足前者的表达式的成为小顶堆,满足后者表达式的为大顶堆,这两者的结构图可以用完全二叉树排列出来。
因为堆有序的特点,一般用来做数组中的排序,称为堆排序。
- 常见的数据结构 -- 散列表
散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。
哈希法(Hashing)是一个用于唯一标识对象并将每个对象存储在一些预先计算的唯一索引(称为“键(key)”)中的过程。因此,对象以键值对的形式存储,这些键值对的集合被称为“字典”。可以使用键搜索每个对象。基于哈希法有很多不同的数据结构,但最常用的数据结构是哈希表。
哈希表通常使用数组实现。
散列数据结构的性能取决于以下三个因素:
1、哈希函数
2、哈希表的大小
3、碰撞处理方法
面试中关于哈希结构的常见问题:
1、在数组中查找对称键值
2、对追踪遍历的完整路径
3、查找数组是否是另一个数组的子集
4、检查给定的数组是否不相交