算法和数据结构在面试中备受面试官的青睐,其中排序和查找是面试中考察算法的重点。
在准备面试的时候,我们应该重点掌握二分查找、快速排序和归并排序,做到能随时正确、完整地写出代码。
查找和排序都是在程序设计中常用到的算法。关于查找算法应该掌握:顺序查找、二分查找、哈希表查找和二叉排序树查找,特别应该重点学习的是二分查找和哈希表查找。二分查找可以灵活的运用在许多查找场景中,所以比较重要。同时,哈希表查找由于是最快的查找算法,时间复杂度是O(1),所以也很重要。
特别注意:在面试的时候,不管是用循环还是递归,面试官都希望面试者能够完整正确的写出二分查找代码。
/**
* 二分查找算法
* @param array 查找的有序数组
* @param key 待查元素
* @return
*/
public static int binSearch(int[] array, int key) {
int low = 0;
int high = array.length - 1;
while(low <= high) {
int mid = (low + high)/2;
if(array[mid] == key) {
return mid;
}else if(array[mid] < key) {
low = mid + 1;
}else {
high = mid - 1;
}
}
return -1;
}
题目来源:牛客网在线编程专题《剑指offer》
题目地址:https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&tqId=11190&tPage=2&rp=2&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking
题目描述:
统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。
提示:在排序的数组(或者部分排序的数组)中查找一个数字或者统计某个数字出现的次数,都可以尝试使用二分查找算法。
哈希表和二叉排序树查找的重点在于考察对应的数据结构。
哈希表最主要的优点是我们利用它能够在O(1)的时间效率下查找到某一元素,是效率最高的查找方式。但缺点是需要额外的空间来实现哈希表。
1. 哈希表的定义:
根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的、地址连续的地址集(区间)上,并以关键字在地址集中的映射作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。
2. 构造哈希函数的方法:
对数字的关键字可有下列构造方法:
1)直接定址法
哈希函数为关键字的线性函数
H(key) = key 或者
H(key) = a * key + b
此方法仅适合:地址集合的大小等于关键字集合的大小。
优点:以关键码key的某个线性函数值为哈希地址,不会产生冲突。
缺点:要占用连续地址空间,空间效率低。
2)数字分析法
方法:假设关键字集合中的每个关键字都是由S位数字组成(u1,u2,...,us),分析关键字集合的全体,并从中提取分布均匀的若干位或它们的组合作为地址。
所选的位应当是:各种符号在该位上出现的频率大致相同。
此方法仅适合于:能预先估计出全体关键字的每一位上各种数字出现的频率。
3)平方取中法
4)折叠法
5)除留余数法
6)随机数法
若是非数字关键字,则需先对其进行数字化处理。
3. 处理冲突的方法
“处理冲突”的实际含义是:为产生冲突的地址寻找下一个哈希地址。
1)开放定址法(开地址发)
2)链地址法(拉链法)
3)再哈希法(双哈希函数法)
4)建立一个公共溢出区
与二叉排序树查找算法对应的数据结构是二叉搜索树。
排序算法在面试中考察的比查找算法要复杂且深入。在面试中,经常考察面试者比较快速排序、堆排序、归并排序、直接插入、简单选择、冒泡排序、折半插入排序等不同算法的优劣,要求面试者能从平均时间复杂度、额外空间消耗、稳定性、最坏时间复杂度等方面去比较它们的优缺点。
特别注意:在很多的面试场合中,面试官都喜欢让面试者现场手写出快速排序的代码。
快速排序的缺点:
快速排序虽然总体的平均效率是最好的,但不是任何时候都是最优的算法。比如,数组本身已经排好序了,而每一轮排序都是以最后一个数字作为比较的标准,此时快速排序的时间复杂度是O(),因此在这种场合下快速排序就不是最优的算法。
关于归并排序的详细讲解看我的文章:【数据结构】归并排序
实战分析:
《剑指offer》面试题36:数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
统计逆序对的过程:先把数组分隔成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。在统计逆序对的过程中,还需要对数组进行排序。如果对排序算法很熟悉,我们不难发现这个排序的过程实际上就是归并排序。
Reference:
https://blog.csdn.net/oMengLiShuiXiang1234/article/details/51759330