查询指定区间第k大的值

qq_36403915 2017-08-01 04:12:35
n<100,000,共有1000,000次查询,时间限制2000ms
...全文
847 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx3275852 2020-04-27
  • 打赏
  • 举报
回复
引用 7 楼 lx3275852 的回复:
[quote=引用 3 楼 yyfhz 的回复:] 不完整的快排可以不?
可以。 我大概做过实验,百万以上的数据量,改后的排速度最快(也就是三楼说的不完整快排),比主席树快(6楼的方法),更比堆排序快(很意外居然前几楼没人提到堆排序)。可能是因为主席树空间复杂度比较高,所以耗时。 大概方法是快排砍半。时间复杂度LogN*Log(N-K),空间复杂度是O(1) 本来的快排是: 第一步,分组。第二步,递归排左边。第三步,递归排右边。 3楼说的那个: 第一步,分组。第二步,分情况,如果分组的那个数<K,只递归找左边;如果分组的那个数>K,只递归找右边。 看起来好像和快排差不多,但实际上时间复杂度远小于快排,因为每次分组之后都要砍半,每次砍半啊,不是1/2的时间。 另外,除了这种改装快排,比较快的方法有主席树时间复杂度理论上和快排砍半差不多。还有堆排序。 堆排序建堆还是比较快的,关键是堆排序把前面k的排好序了,后买虽然不需要排序,但也浪费了好多时间,k越大时间浪费越多。[/quote] 仔细想了想,时间复杂度可能算的不对,不是O(logN*log(N-K)),时间复杂度大概是O(n)。 第一次遍历n,第二次n/2,第三次n/4,第四次n/8,第五次n/16……加起来约等于2*n,和k的值几乎无关。 快排第一次n,第二次n,第三次n……
lx3275852 2020-04-27
  • 打赏
  • 举报
回复
引用 3 楼 yyfhz 的回复:
不完整的快排可以不?
可以。 我大概做过实验,百万以上的数据量,改后的排速度最快(也就是三楼说的不完整快排),比主席树快(6楼的方法),更比堆排序快(很意外居然前几楼没人提到堆排序)。可能是因为主席树空间复杂度比较高,所以耗时。 大概方法是快排砍半。时间复杂度LogN*Log(N-K),空间复杂度是O(1) 本来的快排是: 第一步,分组。第二步,递归排左边。第三步,递归排右边。 3楼说的那个: 第一步,分组。第二步,分情况,如果分组的那个数<K,只递归找左边;如果分组的那个数>K,只递归找右边。 看起来好像和快排差不多,但实际上时间复杂度远小于快排,因为每次分组之后都要砍半,每次砍半啊,不是1/2的时间。 另外,除了这种改装快排,比较快的方法有主席树时间复杂度理论上和快排砍半差不多。还有堆排序。 堆排序建堆还是比较快的,关键是堆排序把前面k的排好序了,后买虽然不需要排序,但也浪费了好多时间,k越大时间浪费越多。
隐语的影法師 2020-04-12
  • 打赏
  • 举报
回复
真搞不懂~主席树裸题有什么好问的?
lnpu_hsj 2017-10-31
  • 打赏
  • 举报
回复
划分树求解区间查询第k大值问题,时间复杂度logN
无语_ 2017-09-01
  • 打赏
  • 举报
回复
可以考虑离散化之后映射到1-100000,然后用可持久化线段树查询第K大(可持久化线段树入门题区间第K大)
yyfhz 2017-08-17
  • 打赏
  • 举报
回复
不完整的快排可以不?
三仙半 2017-08-09
  • 打赏
  • 举报
回复
可以考虑用KD-tree实现,首先预处理,得到最大值,,复杂度为O(n),然后,求其K近邻,因为是一维的,复杂度为O(lgn*k)
真相重于对错 2017-08-01
  • 打赏
  • 举报
回复
冒泡排序前k次循环

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧