数据结构 算法 编程 面试

作为一个非科班出身程序员,数据结构先天不足,学了就忘,提笔忘码经常发生,恨恨不已,决心好好打基础!此贴为证,坚持每天进步一点点!


1.n长度的数组,计算第m大个数?时间复杂度怎么小于O(nlgn)?

此题实际是在问顺序统计量,定义如下:实际上就是快排思想。

The ith order statistic of a set of n elements is the ith smallest element。

算法如下,时间期望为O(n):区别快排的原因是只有一个递归式而快排有2个。



进一步,如果利用数据结构辅助排序算法->优先队列,比如堆,可以用一个大根堆,元素m个,不断插入堆直到n个元素。

时间分析:建堆O(n),插入堆O(lgn),所以O(nlgn). 如果此处用数组,插入排序每次O(n),总时间O(n^2)

以上分析虽然看似没有减小时间,但是实际上要比整体排序的时间要短,具体算紧上限的话,我还不会做。


再进一步,还是利用数据结构排序思想,既然二叉搜索树和快排是失散多年的兄弟,红黑树的性能不是更好。

所以利用红黑树解决顺序统计问题也叫动态顺序统计,因为此时集合动态的。对红黑树进行扩张,增加除了Key的另一个域,记录所有子树的个数+1。算法很简单了,分析:

因为红黑树是平衡树,树高平均O(lgn),而且维护树的特性(insert/delete)也是O(lgn),所以总的时间是O(lgn).是不是很惊喜!


3.关于比较排序为什么最快时间是O(nlogn),那么肯定还有更快的不是基于比较的排序算法?


2.链表逆转?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值