关闭

数据结构 算法 编程 面试

229人阅读 评论(0) 收藏 举报

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


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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3470次
    • 积分:94
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条