数据结构1.0 面试题
1.什么是稳定排序和不稳定排序 "稳定排序和不稳定排序是排序算法的两种分类。
稳定排序算法保证在排序过程中,相同元素的相对位置不变。
不稳定排序算法则不保证在排序过程中,相同元素的相对位置不变。
常见的稳定排序算法包括: 冒泡排序 快速排序
常见的不稳定排序算法包括: 选择排序 堆排序"
二叉树前、中、后序遍历的规则 "前序遍历:先访问根结点、再前序遍历左子树、最后前序遍历右子树;
中序遍历:中序遍历左子树、访问根节点、中序遍历右子树;
后续遍历:后序遍历左子树、后序遍历右子树、访问根结点;"
队列和栈的区别 "1.规则不同
队列:先进先出
栈:先进后出
2.对插入和删除的限定不同
队列:只能在表的一段进行插入,并在另一端进行删除
栈:只能在表的一端插入和删除
3.遍历数据速度不同
队列:基于地址指针进行遍历,可以从头或者尾部进行遍历,不能同时遍历,无需开辟新空间,在遍历过程中不影响数据结构,所以遍历速度快。
栈:只能从栈顶取数据,如果要取出栈底的数据,需要遍历整个栈,并且需要遍历的同时开辟空间,保持遍历前的一致性。"
冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序的时间复杂度 "1. 冒泡排序(Bubble Sort):
- 平均时间复杂度:O(n^2)
- 最坏情况时间复杂度:O(n^2)
2. 插入排序(Insertion Sort):
- 平均时间复杂度:O(n^2)
- 最坏情况时间复杂度:O(n^2)
3. 选择排序(Selection Sort):
- 平均时间复杂度:O(n^2)
- 最坏情况时间复杂度:O(n^2)
4. 希尔排序(Shell Sort):
- 平均时间复杂度:取决于增量序列的选择,一般为O(n^1.3)
- 最坏情况时间复杂度:取决于增量序列的选择,一般为O(n^2)
5. 归并排序(Merge Sort):
- 平均时间复杂度:O(nlogn)
- 最坏情况时间复杂度:O(nlogn)
6. 快速排序(Quick Sort):
- 平均时间复杂度:O(nlogn)
- 最坏情况时间复杂度:O(n^2)
7. 堆排序(Heap Sort):
- 平均时间复杂度:O(nlogn)
- 最坏情况时间复杂度:O(nlogn)"
内核链表的实现原理 "内核链表是Linux内核中用于管理内核对象的一种高效数据结构。它是基于双向链表实现的,每个链表节点都包含两个指针,一个指向前一个节点(prev),另一个指向后一个节点(next)。这种结构允许从任何一个节点出发,向前或向后遍历链表。
内核链表的一个关键特点是其通用性。在Linux内核中,链表节点通常是嵌入在其他数据结构中的,这使得链表可以适应不同的使用场景。此外,通过定义结构体并在其中嵌入list_head类型的成员变量,可以将这个结构体作为链表节点使用,然后使用链表相关的函数对这些节点进行插入、删除、遍历等操作。"
什么是B树和B+树,它们有什么区别 "B树和B+树都是自平衡的树状数据结构,它们被广泛应用于文件系统和数据库中,用于存储和管理大量数据的索引结构。以下是关于B树和B+树的详细解释以及它们之间的主要区别:
B树:
B树,也被称为平衡多路查找树或B-树,是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找、插入和删除。
B树可以定义一个m值作为预定范围,即m路(阶)B树。每个节点最多有m个孩子,至少有ceil(m/2)个孩子(除了根节点和叶子节点外)。
B树在数据库或文件系统中应用广泛,特别是在需要高效地处理大量数据的场景下。
B+树:
B+树是B树的一种变体,也属于平衡多路查找树。其大体结构与B树相同,包含根节点、内部节点和叶子节点。
B+树内部节点不保存数据,只保存关键字用作索引,所有数据都保存在叶子节点中。这使得B+树能在内存中存放更多索引,增加缓存命中率。
B+树的叶子节点相连,这使得遍历操作非常方便,同时数据具有顺序性,便于区间查找。
B树与B+树的主要区别:
关键字的数量:B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只起到了一个索引的作用。而B树虽然也有m个子结点,但只拥有m-1个关键字。
存储位置:B+树中的数据都存储在叶子结点上,也就是说其所有叶子结点的数据组合起来就是完整的数据。而B树的数据存储在每一个结点中,并不仅仅存储在叶子结点上。
分支结点的构造:B+树的分支结点仅仅存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息。
查询过程:B树在找到具体的数值以后,查询就结束了。而B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径。"
什么是动态规划,以及动态规划的特点和用途 "动态规划是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
动态规划的特点主要有以下几点:
1、重叠子问题:在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不都是新的,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算这个子问题时,就可以直接从表格中获取结果,从而避免了大量的重复计算。
2、最优子结构:问题的最优解包含了其子问题的最优解。这种性质称为最优子结构性质。问题的最优解可以由其子问题的最优解推导得到。
动态规划的用途非常广泛,包括但不限于以下几个方面:
1、背包问题:在给定一系列物品,每种物品都有自己的重量和价值,以及一个背包的最大承重能力的情况下,如何选择物品放入背包,使得背包内物品的总价值最大,同时不超过背包的承重能力。
2、最短路径问题:在图论中,求解从一个顶点到另一个顶点的最短路径问题,如Dijkstra算法和Floyd-Warshall算法都利用了动态规划的思想。
3、资源分配问题:如何合理分配有限的资源,使得某种指标达到最优,这类问题也可以通过动态规划来解决。"
什么是哈希表,以及哈希表的特点和用途 "哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,从而加快查找的速度。这个映射函数叫做散列函数(哈希函数),存放记录的数组叫做散列表。
哈希表的特点主要有:
1、查找速度快:通过哈希函数,可以快速定位到所需的数据,无需遍历整个数据结构。
2、插入和删除操作可能较慢:在某些情况下,当哈希表中的数据量较大时,插入和删除操作可能需要调整数据的位置或重新计算哈希值,因此可能会比查找操作慢一些。
哈希表的用途广泛,包括但不限于以下几个方面:
1、关联数组:哈希表可以作为关联数组使用,将键映射到对应的值,实现快速的键值对存储和查找。
2、数据库索引:在数据库中,哈希表可以用于实现索引,加快数据的检索速度。
3、缓存:哈希表常用于缓存系统,快速查找缓存中是否存在某个键值对。
4、集合:哈希表也可以用于实现集合数据结构,支持快速的插入、删除和查找操作。"
什么是红黑树,以及红黑树的特点和用途 "红黑树是一种自平衡的二叉查找树。红黑树在保持平衡的同时,通过对树进行着色和特定的调整操作,实现了高效的查找、插入和删除功能。
