【面试心得】算法和数据结构:查找和排序

算法和数据结构在面试中备受面试官的青睐,其中排序和查找是面试中考察算法的重点。

在准备面试的时候,我们应该重点掌握二分查找、快速排序归并排序,做到能随时正确、完整地写出代码。

查找排序都是在程序设计中常用到的算法。关于查找算法应该掌握:顺序查找、二分查找哈希表查找和二叉排序树查找,特别应该重点学习的是二分查找和哈希表查找。二分查找可以灵活的运用在许多查找场景中,所以比较重要。同时,哈希表查找由于是最快的查找算法,时间复杂度是O(1),所以也很重要。

一、查找

(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。

提示:在排序的数组(或者部分排序的数组)中查找一个数字或者统计某个数字出现的次数,都可以尝试使用二分查找算法。

(2)哈希表

哈希表和二叉排序树查找的重点在于考察对应的数据结构。

哈希表最主要的优点是我们利用它能够在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)建立一个公共溢出区

(3)二叉排序树

与二叉排序树查找算法对应的数据结构是二叉搜索树。

二、排序

排序算法在面试中考察的比查找算法要复杂且深入。在面试中,经常考察面试者比较快速排序堆排序归并排序直接插入简单选择冒泡排序折半插入排序等不同算法的优劣,要求面试者能从平均时间复杂度额外空间消耗稳定性最坏时间复杂度等方面去比较它们的优缺点。

(1)快速排序

特别注意:在很多的面试场合中,面试官都喜欢让面试者现场手写出快速排序的代码。

快速排序的缺点:

快速排序虽然总体的平均效率是最好的,但不是任何时候都是最优的算法。比如,数组本身已经排好序了,而每一轮排序都是以最后一个数字作为比较的标准,此时快速排序的时间复杂度是O(n^{2}),因此在这种场合下快速排序就不是最优的算法。

(2)归并排序

关于归并排序的详细讲解看我的文章:【数据结构】归并排序

实战分析:

《剑指offer》面试题36:数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

统计逆序对的过程:先把数组分隔成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。在统计逆序对的过程中,还需要对数组进行排序。如果对排序算法很熟悉,我们不难发现这个排序的过程实际上就是归并排序。

Reference:

https://blog.csdn.net/oMengLiShuiXiang1234/article/details/51759330

你可能感兴趣的:(面试+笔试)