作为一个非科班出身程序员,数据结构先天不足,学了就忘,提笔忘码经常发生,恨恨不已,决心好好打基础!此贴为证,坚持每天进步一点点!
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.链表逆转?