算法核心知识总结

(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问题的解决思路:

  1. 堆排序
  2. 分治法(将数百亿的数分流到不同机器,然后统计最大值)

 

(11)堆的常用API
heap.offer(num)  向队尾插入元素
heap.peek()   输出堆顶元素
heap.poll()   弹出堆顶元素
求中位数,可以使用大小根堆,或者平衡二叉排序树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值