算法核心知识总结
(1)
数组和链表的区别:数组支持顺序访问,就是可以随机的访问任意元素而不必从头开始遍历,因此适合
查找,但不擅长插入与删除,因为还要移动后面的元素
而链表基于本身的特点是,末尾指针始终指向下一个元素,因此适合插入删除操作,但不适用与随机访问,
因为要重头开始遍历
(2)
算法复杂度
如果对小规模数据进行排序,可以选择时间复杂度是O(n2)的算法;如果对大规模数据进行排序,时间复杂度是O(nlogn)的算法更加高效。所以,为了兼顾任意规 模数据的排序,一般都会首选时间复杂度是O(nlogn)的排序算法来实现排序函数。
时间复杂度是O(nlogn)的排序算法不止一个,我们已经讲过的有归并排序、快速排序,后面讲堆的时候我们还会讲到堆排序。堆排序和快速排序都有比较多的应 用,比如Java语言采用堆排序实现排序函数,C语言使用快速排序实现排序函数。
(3)荷兰国旗问题解法:分区的概念
因此引出快排的概念。快排核心理念是选取最后一个数进行分区,小于该数的放左边,等于的放中间,大于的放右边。空间复杂度是O(1),时间复杂度是O(n)。但是每个分区都是不稳定的。除非进行01 stable sort优化
对快排的改进方法是随机选取一个数,而不是固定为最后一个数,那么所得出来的复杂度也是随机的
(4)满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
完全二叉树概念:必须从左到右都需要补齐(如果有的话)
满二叉树,每个节点必须有两个孩子
大根堆:子树的根节点一定是最大的
小根堆:子树的根节点一定是最小的
(5)堆排序的原理:先建立一个大根堆,然后大根堆的堆顶与最后一个位置交换,然后弹出最大值,堆的大小减1,重新建立大根堆,以此反复即可。堆是一个非常有用的数据结构,在40亿的数据进行排序,也只是O(logN)= 32而已
(6)排序算法稳定性的非常有用,就像电商项目排序商品,同样价格的排序肯定不能上下浮动
(7)队列实现栈:
4321从尾部进入help队列,5出队,交换Help和data队列,重复以上行为
栈实现队列:
12345入栈,然后倒过去pop栈,然后出栈即可
(8)链表判断是否为回文数字,用快慢指针的思想
(9)在100T文件中找重复的语句的解决思路:
利用hash函数,输入相同,输出也必定相同的思路。准备1000台机器,对语句进行hash散列进不同的机器中,达到分流效果。最后利用多线程判断即可
()Top-K问题的解决思路:
- 堆排序
- 分治法(将数百亿的数分流到不同机器,然后统计最大值)