社区
数据结构与算法
帖子详情
查询指定区间第k大的值
qq_36403915
2017-08-01 04:12:35
n<100,000,共有1000,000次查询,时间限制2000ms
...全文
847
8
打赏
收藏
查询指定区间第k大的值
n<100,000,共有1000,000次查询,时间限制2000ms
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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次循环
MATLAB图像处理
介绍MATLAB提供的图像处理功能,包括图像基础知识、图像合成、空间变换、邻域和块处理、局部滤波、正交变换、数学形态学、图像分析、图像增强、图像恢复、图像分割、图像配准和图像三维重建等内容。...
zoj 2112 Dynamic Rankings 带修改
区间
第k大的几种解法
给出n个数,有两种操作,一种是修改某个数的
值
,另一种
查询
指定
区间
第k大。 比较快的做法是树套树,而分块算法复杂度比较高写起来方便。分块算法可以很简单的处理单独修改某个
值
的情况。 将n个数分成num块,每块大小siz=n/num。每一块内部排序进行排序,
查询
[l,r]第k大时,先二分答案,对于完全包含在
区间
的内块直接二分搜索,而对于
区间
两端只有部分包含的则直接遍历查找。复杂度是logn*(2*s
区间
第k小问题(多种解法)
解法一:分块 将n个数分成√n * logn 块,对每块进行块内排序。 我们假设X是
区间
内第K小的数,那么不大于X的数至少有K个(包含X自己)。那么我们就可以二分答案,每次二分一个
值
X,之后去
区间
中找不大于X的数。因为对于每个块都是排好序的,所以如果该块完全包含在
区间
内的话,就直接对块进行二分查找不大于X的数有多少个;块部分包含在
区间
内的就直接暴力查找。根据查找的
值
再扩大或者缩小X
值
。 这个时候时间复杂度就是O( n×logn + m√nlog1.5n) code:(待补) 解法二:主席树 静态求
区间
第k
Gym 102770 E-Easy DP Problem (主席树
查询
区间
前k大的和)
题意:写着DP总不可能是dp吧,就是给定一个dp[i][j]的求解方式,如图中分段函数所示,然后给你一个l r k,然后问你dp[ r-l+1 ][ k ]的
值
为多少? 思路:既然题目那这DP,那应该就不是DP吧。手写几项后,反正我写不出来 ,发现我们需要求得就是(∑i=1r−l+1i2\sum_{i=1}^{r-l+1}i^2∑i=1r−l+1i2) + [blb_lbl,bl+1,......brb_{l+1},......b_rbl+1,......br]中前k大的数和。 前面的式子很好维护.
编写求函数
区间
平均
值
的通用函数
题目内容:编写求数学函数
区间
平均
值
的通用函数,可以计算出在
指定
区间
内函数的平均
值
(取整即可)。待求
区间
平均
值
的两个函数的原型为:int func1(int x);int func2(int x)只考虑参数为整数的情况即可。func1的数学表达式为:y=a*x^2+b*x+c,a,b,c由用户输入;func2的数学表达式为:y=x^m,m由用户输入;通用函数的参数为待求
区间
平均
值
函数的指针,以及...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章