数据结构与算法常见面试题2

1.十大排序

在这里插入图片描述
①冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
②选择排序首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
③插入排序的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
④希尔排序也是一种插入排序,该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
⑤归并排序是采用分治法,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
⑥快速排序通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
⑦堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
⑧计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
⑨桶排序是计数排序的升级版。桶排序假设输入数据服从均匀分布,将数据分到有限的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)
⑩基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

2.解决技术面试题的的五步法以及算法题的五种解法。(程序猿面试金典)

五步法:Step1.向面试官提问,以消除疑虑。
Step2.设计一种算法。(时间复杂度、空间复杂度、数据量)
Step3.先写伪代码,但务必告诉面试官接下来会写真实的代码。
Step4.写代码要不紧不慢。
Step5.测试写好的代码,仔细修正每一处错误。(极端、错误、一般用例)
五种解法:1.穷举法;(时针与分针之间的角度问题)
2.模式匹配法;(有序数组旋转之后得最小值)
3.简化推广法;(杂志中的的勒索信)
4.简单构造法;(该类问题一般用递归法,eg:无重复字符的排列组合)
5.数据结构头脑风暴法。(随机数的中位数)

3.解释什么是递归算法?提到递归算法的三个定律是什么?递归与栈?

所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解(比如查字典),解决大问题的方法和解决小问题的方法往往是同一个方法。
所有递归算法必须遵循三个规律(这也是问题可以选择递归的关键):①递归算法必须有一个基点(明确递归终止条件);②递归算法必须有一个趋向基点的状态变化过程(给出递归终止时的处理办法);③递归算法必须自我调用(提取重复的逻辑,缩小问题规模)。
递归的过程就是出入栈的过程。递归深度就栈的高度,当没有递归终止条件时,也就是递归深度没有限制时,栈就可能会出现栈溢出异常。
哪些情况下会用到递归算法:
(1).问题的定义是按递归定义的(Fibonacci函数,阶乘,…);
(2). 问题的解法是递归的(有些问题只能使用递归方法来解决,例如,汉诺塔问题,…);
(3). 数据结构是递归的(链表、树等的操作,包括树的遍历,树的深度,…)。

4.什么是“哈希算法”,它们用于什么?解决hash冲突的方式有哪些?

哈希(Hash)算法,即散列函数。哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。同时,它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。它用于密码有效性、消息和数据完整性以及许多其他加密系统。
加密是将明文转换为称为“密文”的密码格式的过程。要转换文本,算法使用一系列被称为“键”的位来进行计算。密钥越大,创建密文的潜在模式数越多。大多数加密算法使用长度约为64到128位的固定输入块,而有些则使用流方法。 一些常用的加密算法是:3-way;Blowfish;CAST;CMEA;GOST;DES 和Triple;DES;IDEA;LOKI等等
哈希函数是指如何对关键字进行编址的规则,这里的关键字的范围很广,可视为无限集,如何保证无限集的原数据在编址的时候不会出现重复呢?保证不了?→哈希冲突!!!
①开放定址法:
所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到
②再哈希法:
再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,….,等哈希函数计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。
③链地址法: (HashMap)
链地址法基本思想:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向 链表连接起来。

你可能感兴趣的:(五.数据结构与算法篇)