面试题总结(一)【数据结构】【华清远见西安中心】

  • 线性表
  • 顺序表:顺序表是一种线性表,用一组连续的存储单元来存储线性表的元素,其特点是随机访问元素的时间复杂度为O(1)
  • 链表:链表是一种数据结构,它由一系列节点组成,每个节点包含两部分:数据和指向下一个节点的指针。链表中的第一个节点称为头结点,最后一个节点称为尾节点,尾节点的指针指向空值。链表可以用来实现栈、队列等数据结构
  • 栈:栈是一种线性数据结构,它具有后进先出的特点。栈的基本操作包括入栈和出栈,入栈将元素压入栈顶,出栈将栈顶元素弹出
  • 队列:队列是一种线性数据结构,它具有先进先出的特点。在队列中,新元素插入到队列的一端,称为队尾,已有元素从队列的另一端删除,称为队头
  • 循环队列:循环队列是一种环形的队列结构,它可以充分利用数组空间,避免了普通队列在出队操作后需要移动元素的问题。循环队列有两个指针,一个指向队头,一个指向队尾,当队尾指针到达数组末尾时,会回到数组开头,形成一个环
  • 二叉树
  • 二叉排序树:若左子树不为空,则左子树上所有节点的值均小于它的根节点的值;若右子树不为空,则右子树上所有节点的值均大于它的根节点的值;左、右子树也分别为二叉排序树;没有键值相等的节点;二叉排序树的主要应用是实现快速查找和排序。在二叉排序树中,查找、插入和删除操作的时间复杂度为O(logn)
  • 霍夫曼树:霍夫曼树是一种带权路径长度最短的树,也称为最优二叉树。它的构造过程是:给定 n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称为霍夫曼树。将n个权值看成n棵只有一个结点的二叉树;在森林中选取两棵根节点权值最小的树合并,得到一课新树,新树的根节点权值为其左右子树的根节点权值之和;将新树插入到森林中,并删除原来两棵树;重复步骤,直到森林中只有一棵树为止,这棵树就是霍夫曼树
  • 算法 
  • 折半查找:折半查找是一种在有序数组中查找某一特定元素的搜索算法。该算法每次查找都将待查找区间折半,直到找到目标元素或者区间缩小为0为止,折半查找的时间复杂度为O(logn)
  • 索引查找:索引查找是一种在数据结构中查找特定元素的方法,它通过使用预先计算的索引来加快查找速度。索引通常是一个数组,其中包含指向数据结构中每个元素的指针或关键字的值。通过使用索引,可以避免在数据结构中进行线性搜索,从而提高查找效率
  • 二叉查找树:若左子树非空,则左子树上所有节点的值均小于它的根节点的值;若右子树为空,则右子树上所有节点的值均大于它的根节点的值;左右子树本身也分别是二叉查找树
  • Hash散列:散列树是一种数据结构,它将数据按照散列函数的结果分配到不同的子树中。每个子树又是一课二叉搜索树。这样可以在保持二叉搜索树的查找、插入、删除等操作的同时,提高散列函数的效率,减少冲突
  • 平衡树:平衡树是一种自平衡的二叉搜索树,它能够保证在最坏情况下基本动态集合操作的时间复杂度为O(logn)。平衡树的常见的实现有红黑树、AVL树、Treap等
  • B-树:B-树是一种自平衡的树形数据结构,它可以用来存储大量的数据并且能够在对数时间内进行查找、插入和删除操作。B-树通常用于数据库和文件系统中,因为它们需要高效地处理大量的数据。B-树的特点是每个节点可以存储多个元素,并且每个节点都有多个子节点。B-树的节点通常被称为页,每个页可以存储多个元素和指向子节点的指针。B-树的高度通常比较小,因此它可以在磁盘上进行高效的操作。B-树的查找、插入和删除操作都是基于二分查找的,因此它们的时间复杂度都是O(logn)。B-树的平衡性保证了它们的性能不会随着数据量的增加而降低
  • B+树:B+树是一种常用的数据结构,通常用于数据库索引和文件系统中。它是一种多路搜索树,每个节点可以存储多个关键字和对应的指针,而且所有叶子节点都在同一层上,方便范围查询。所有关键字都在叶子节点上,非叶子节点只存储关键字的索引;所有叶子节点都在同一层上,方便范围查询;叶子节点之间通过指针连接,形成一个有序链表,方便范围查询和遍历;非叶子节点的关键字个数比其子节点的个数少1,这样可以保证树的的平衡性
  • 红黑树:红黑树是一种自平衡的二叉查找树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。通过对任何一条从根到叶子节点路径上的各个节点的颜色进行约束,红黑树确保没有一条路径比其他路径长出两倍。因此,红黑树是一种弱平衡树。每个节点要么是红色,要么是黑色;根节点是黑色;每个叶子节点是黑色的;如果一个节点是红色的,则它的两个子节点都是黑色的;对于每个子节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点
  • 结构  
  • 简单冒泡:arr是待排序的数组,n是数组的长度。这个代码使用了两层循环,外层循环控制排序的轮数,内层循环控制每一轮中相邻元素的比较和交换
  • 简单选择:简单选择排序是一种基于比较的排序算法,其基本思想是每次从待排序的元素中选出最小的一个元素,放到已排好序的元素序列的最后,直到所有元素均排序完毕。arr为待排序的数组,n为数组长度,i和j 分别为外层和内层循环的计数器,min_index为当前未排序部分中最小元素的下标
  • 简单插入:arr是待排序的数组,n是数组的长度。算法的基本思想是将数组分为已排序和未排序两部分,每次从未排序部分中取出一个元素,插入到已排序部分中的合适位置
  • 快速排序:快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字比另一部分记录的关键字小,然后再分别对这两部分记录继续进行排序,以达到整个序列有序的目的。具体实现过程如下:选择一个基准元素,通常选择第一个元素或者最后一个元素;通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素;将基准元素放到两部分中间,这样基准元素左边的元素都比它小,右边的元素都比它大;分别对左右两部分递归地进行快速排序
  • 大顶堆:堆排序是一种基于堆数据结构的排序算法,其中大顶堆是指每个节点的值都大于或等于其子节点的值。堆排序的基本思路是将待排序序列构建成一个大顶堆,然后将堆顶元素与末尾元素交换,再重新调整堆,直到整个序列有序。构建大顶堆,从最后一个叶子节点开始,依次将每个节点与其子节点比较,如果子节点的值大于父节点,则交换两者的值,然后继续向下比较,直到该节点满足大顶堆的性质;交换堆顶元素和末尾元素,将堆顶元素与末尾元素交换,并将末尾元素从堆中删除;调整堆,从堆顶开始,依次将每个节点与其子节点比较,如果子节点的值大于该节点,则交换两者的值,然后继续向下比较,直到该节点满足大顶堆的性质;重复步骤,直到整个序列有序
  • 小顶堆:堆排序是一种基于堆数据结构的排序算法,其中大顶堆是指每个节点的值都大于或等于其子节点的值。堆排序的基本思路是将待排序序列构建成一个大顶堆,然后将堆顶元素与末尾元素交换,再重新调整堆,直到整个序列有序。构建小顶堆,从最后一个非叶子节点开始,依次将其与其子节点比较并交换,直到该节点满足小顶堆的性质,然后继续处理前一个非叶子节点,直到根节点;取出堆顶元素,将堆顶元素与最后一个元素交换,并将堆的大小减1;调整堆,从根节点开始,将其与其子节点比较并交换,直到该节点满足小顶堆的性质,然后继续处理其子节点,直到叶子节点。时间复杂度为O(nlogn),空间复杂度为O(1)
  • 基数排序:基数排序是一种非比较排序算法,它根据数字的每个位数来进行排序。具体来说,它将所有待比较数值统一为同样的数位长度,然后从最低位开始,依次进行排序。这样从最低位排序一直到最高位排序完成后,数列就变成一个有序序列。基数排序对数据的要求比较高,需要可以分割出独立的“位”来比较,而且位之间有递进的关系,如果数据在某个位上的数值比较大,那么在高位上就不用再进行比较了
  • 桶排序:桶排序是一种线性排序算法,它的基本思想是将待排序的元素分到不同的桶中,再对每个桶中的元素进行排序,最后将各个桶中的元素按照顺序依次取出,即可得到有序序列。具体实现步骤如下:确定桶的个数和每个桶的取值范围;遍历待排序数组,将每个元素放入对应的桶中;对每个桶中的元素进行排序;将各个桶中的元素按照顺序依次取出,即可得到有序序列。桶排序的时间复杂度为O(n),但是需要额外的空间来存储桶
  • 归并排序:归并排序是一种基于分治思想的排序算法,它将待排序的序列分成两个子序列,对每个子序列进行递归排序,然后将两个已排序的子序列合并成一个有序序列。将待排序序列分成两个子序列,直到每个子序列只有一个元素为止;对每个子序列进行递归排序;将两个已排序的子序列合并成一个有序序列,在合并两个已排序的子序列时,可以使用双指针法,将两个子序列中较小的元素依次放入一个新的数组中,直到其中一个子序列被遍历完毕,然后将另一个子序列中剩余的元素依次放入新数组中。归并排序的时间复杂度为O(nlogn) ,空间复杂度为O(n)
  • 图:分为邻接矩阵和十字链表
  • 邻接矩阵是一种表示图的方法,它使用一个二维数组来表示图中各个节点之间的连接关系。如果两个节点之间有边相连,则在邻接矩阵中对应的位置上填入1,否则填入0
  • 十字链表是一种特殊的链表结构,它可以用来表示稀疏矩阵。在十字链表中,每个节点有两个指针,一个指向同一行的下一个节点,另一个指向同一列的下一个节点。同时,每个节点还有两个指针,一个指向同一行的头节点,另一个指向同一列的头节点
  • 图的算法:分为深度优先遍历、广度优先遍历、拓扑排序、背包客问题、最短路径算法
  • C语言中的深度优先遍历可以通过递归实现。具体步骤如下:从起始节点开始,访问该节点并标记为已访问;对于该节点的每个未访问过的邻居节点,递归地进行;重复步骤,直到所有节点都被访问过
  • 广度优先遍历是一种图形搜索算法,它从根节点开始,逐层遍历整张图,即先访问距离根节点最近的节点,然后是距离根节点稍远的节点,依次进行搜索,直到遍历完整张图。通常使用队列来实现
  • 拓扑排序是一种对有向无环图进行排序的算法,它可以将图中的节点按照一定的顺序排列。在拓扑排序中,每个节点表示一个任务,每个有向边表示一个任务之间的依赖关系。如果任务A依赖于任务B,那么就会有一条从B指向A的有向边。在进行拓扑排序时,我们需要找到所有入度为0的节点,将它们加入到排序结果中,并将它们从图中删除,然后再找到新的入度为0的节点。重复操作,直到所有节点都被加入到排序结果中或者发现图中存在环。实现拓扑排序,可以使用邻接表来表示有向图,并使用队列来存储入度为0的节点
  • 背包客问题是一个经典的组合优化问题,其描述为,给定一个背包和一些物品,每个物品都有自己的重量和价值,需要选择一些物品放入背包中,使得背包能够承受的重量不超过限制,并且所选物品的总价值最大化。这个问题可以用动态规划算法来解决
  • C语言中的最短路径算法中比较常用的是Diijkstra算法和Floyd算法。 Diijkstra算法是一种贪心算法,用于解决带权重的图中单源最短路径问题。它的基本思想是从起点开始,每次选择当前距离最近的一个顶点,并更新与该顶点相邻的顶点的距离。直到所有顶点都被遍历过。Floyd算法则是一种动态规划算法,用于解决带权重的图中所有点对之间的最短路径问题。它的基本思想是通过中间节点来更新两个顶点之间的距离,直到所有顶点之间的距离都被计算出来
  • 面试题
  • 顺序表和链表的区别?顺序表和链表都是线性表的一种,它的主要区别在于数据的存储方式不同。顺序表是将数据元素存储在一段连续的物理空间中,可以通过下标直接访问,因此随机访问效率高,但插入和删除操作需要移动大量的元素,效率较低。链表是将数据元素存储在一系列不连续的物理空间中,每个节点包含数据和指向下一个节点的指针,因此插入和删除操作只需要修改指针,效率较高,但随机访问效率较低
  • 栈和队列的区别?栈和队列都是常用的数据结构,它的主要区别在于数据的存储和访问方式。栈是一种后进先出的数据结构,只允许在栈顶进行插入和删除操作。也就是说,最后一个进入栈的元素最后被弹出。栈的应用场景比较广泛,例如函数调用、表达式求值、括号匹配等。队列是一种先进先出的数据结构,只允许在队尾进行插入操作,在队头进行删除操作。也就是说,最先进入队列的元素最先被弹出。队列的应用场景也比较广泛,例如任务调度、消息传递、缓存等
  • 如何使用两个栈实现一个队列?使用两个栈可以实现一个队列,具体的实现方法如下:定义两个栈,分别为栈一和栈二;入队时,将元素压入栈一中;出队时,先判断栈二是否为空,如果不为空,则直接弹出栈二的栈顶元素;如果为空,则将栈一中的所有元素依次弹出并压入栈二中,再弹出栈二的栈顶元素;在出队时,如果栈一和栈二都为空,则说明队列为空,无法进行出队操作
  • 如何使用两个队列实现栈?一个队列用来存储栈中的元素,另一个队列用来辅助操作。具体实现:定义两个队列队列一和队列二,队列一用来存储栈中的元素,队列二用来辅助操作;入栈操作时,将元素插入到队列一的队尾;出栈操作时,将队列一中的元素依次出队并插入到队列二中,直到队列一中只剩下一个元素,然后将该元素出队并返回即可;在出队操作时,需要交换队列一和队列二的指针,使得每次操作后队列一始终是存储栈中元素的队列

你可能感兴趣的:(华清远见,西安华清远见,徐子宸,数据结构,面试,职场和发展)