社区
数据结构与算法
帖子详情
请教一个算法
djj2007
2011-03-08 03:27:10
一个集合c,包含大量(>100w)对象,每个对象包含属性:int value1,int value2。每个对象的valve1和value2是一个随机数,在初始化的时候确定。
然后是非常多次的查询,对于每次给定的两个值m,n,得到集合中 value1 > m && value2 > n 的对象集。
求一个算法可以快速求解
...全文
353
15
打赏
收藏
请教一个算法
一个集合c,包含大量(>100w)对象,每个对象包含属性:int value1,int value2。每个对象的valve1和value2是一个随机数,在初始化的时候确定。 然后是非常多次的查询,对于每次给定的两个值m,n,得到集合中 value1 > m && value2 > n 的对象集。 求一个算法可以快速求解
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
foreverlin1204
2011-03-15
打赏
举报
回复
可以离线处理的,问题等价成求二维点坐标上一个点的支配集,离线操作的话可以用树状数组,这个常数远远小于各种平衡树,唯一不好的是这事一个离线的办法
zyl072
2011-03-13
打赏
举报
回复
[Quote=引用 13 楼 xsj_guagua 的回复:]
额,我觉得你真的误会了,对于二维的两个元素,我把它视为一个结构体,然后自定义一个比较函数,比如x,y都大的大之类的,然后转化为一维的问题。
可能你没怎么用过stl的泛型算法吧
[/Quote]
不解释。
你直接上代码吧,我给你找反例。
xsj_guagua
2011-03-13
打赏
举报
回复
[Quote=引用 10 楼 zyl072 的回复:]
引用 3 楼 xsj_guagua 的回复:
对于100w的数据,按照lz的描述,每个数据8字节,那么数据量大于16m
如果数据量在这个等级上的话,在堆中建立RBtree,或者直接用STL的set,你自己定义一个比较函数也可以做到,就是建树的消耗比较大,而且你要求的只是一个大于m,n的集合,并没要求严格排序,所以用tree有点浪费。要达到你要的集合,先中序遍历树,然后每次只要查询到你要的点……
[/Quote]
额,我觉得你真的误会了,对于二维的两个元素,我把它视为一个结构体,然后自定义一个比较函数,比如x,y都大的大之类的,然后转化为一维的问题。
可能你没怎么用过stl的泛型算法吧
幻蝶成仙
2011-03-12
打赏
举报
回复
我个人觉得分如果集合是没有排序的,用树形结构用处不是太大。
如果集合是list的,我建义使用多线程。将集合分成多段,每一个线程做一段。(记得同步结果集合)
zyl072
2011-03-11
打赏
举报
回复
[Quote=引用 6 楼 lzy18lzy 的回复:]
这个问题,可以转化为线段树问题,只不过是分为四叉了
[/Quote]
仔细思考了一下, 四叉的二维线段数可行,而且更快。 赞6楼!
zyl072
2011-03-11
打赏
举报
回复
[Quote=引用 3 楼 xsj_guagua 的回复:]
对于100w的数据,按照lz的描述,每个数据8字节,那么数据量大于16m
如果数据量在这个等级上的话,在堆中建立RBtree,或者直接用STL的set,你自己定义一个比较函数也可以做到,就是建树的消耗比较大,而且你要求的只是一个大于m,n的集合,并没要求严格排序,所以用tree有点浪费。要达到你要的集合,先中序遍历树,然后每次只要查询到你要的点就可以了 O(log2n)
这个问题你可以抽象成……
[/Quote]
请不要把解决一维问题的思路拿来解决二维的问题。
二维的问题在于,
对象之间无法进行大小比较。
举例: (2,3) 和 (3,2) 你说两个对象谁大谁小? 既无大小的概念,又谈何排序?
既然二维对象无法排序,
所有以上回帖中只要是基于有序为前提的算法都是无效的
,包括上面提到的BTree、排序二叉树等。
非得要排序,只能是严格定义 优先按X坐标排,X相等时再按Y坐标排。如此一来进行查找时,可以二分法快速定位到 X > M的位置,但仍然需要对所有的 X>M 进行一次O(N)的遍历,取出其中Y>N的对象。
但显然这是一个低效算法,每次查找的平均复杂度仍然是 O(N)。
========================分割线=====================
说下我的想法,将这些对象看成平面上的坐标点。其实就是给定 任意的(M,N), 求 (M,N) 右上角的所有点。
采用分块方法。假设有100W个点,
初始化:
将整个平面进行分块,分成 10000个块 。
具体分块方式由如下:X坐标轴平均分成100份(按X坐标扫描一遍,每隔1W个点则分出一块)。 Y坐标轴也用同样的方法分成100份。 由此,X坐标方向和Y坐标方向总共被切分成1万个块。每块平均有100个点。
对于每一个块内的元素,分别存两份,一份按X坐标排序,另一份按Y坐标排序。
查找算法
对于任意给定的(M,N) ,先用二分的方法定位出该点所在的
块
。
1.显然,该块的右上角所有块都必定是满足条件的,直接将这些块内的元素全部输出。
2.遍历一次该块内部的100个点,得到块内满足条件的点输出。
3.遍历该块右边的所有同一水平线上的块, 对每一个块的
Y坐标
排序那一份进行二分定位。然后
输出所有 Y>N的点
。
4.遍历该块上面的所有同一竖直线上的块,对每一个块的
X坐标
排序的那一份进行二分定位,然后
输出所有N>X的点
。
复杂度估计,除去输出的时间,最终用来求结果的复杂度稳定在 O( 100 * LOG(100))。
弦率
2011-03-10
打赏
举报
回复
学习了,链表能实现吗
chunjvke
2011-03-10
打赏
举报
回复
由于查询次数多,应当对两个属性建索引,
lzy18lzy
2011-03-09
打赏
举报
回复
这个问题,可以转化为线段树问题,只不过是分为四叉了
showjim
2011-03-09
打赏
举报
回复
相当于一个矩阵找一个角的所有点,4叉树应该可以用
超级大笨狼
2011-03-09
打赏
举报
回复
如果是比较大小的话,利用二叉树。
djj2007
2011-03-08
打赏
举报
回复
请问下rtree该怎么实现,好像是用于磁盘文件管理的吧
xsj_guagua
2011-03-08
打赏
举报
回复
对于100w的数据,按照lz的描述,每个数据8字节,那么数据量大于16m
如果数据量在这个等级上的话,在堆中建立RBtree,或者直接用STL的set,你自己定义一个比较函数也可以做到,就是建树的消耗比较大,而且你要求的只是一个大于m,n的集合,并没要求严格排序,所以用tree有点浪费。要达到你要的集合,先中序遍历树,然后每次只要查询到你要的点就可以了 O(log2n)
这个问题你可以抽象成在一组无序数中寻找第k大的数算法,只不过你这的比较函数要自定义一下,而你要寻找的是比k大的一个区间。
算法导论上有给出这个中位数算法,就是按照快排的划分算法,每划分一次,按照中间点的位置和你要寻找的k数字相比较,如果大,就在当前区间的左半边继续进行划分,如果小,就在当前区间的右半边进行划分,递归进行,这种单次的复杂度为O(n),当你频繁查询的时候,你可以记下上一次的查询位置,以后的每次只要在半边进行划分就可以了,虽然也是O(log2n)但是n平均情况下要比之前的小一半。
绿色夹克衫
2011-03-08
打赏
举报
回复
用类似RTree的方式做索引可以,还能实现更复杂的查询
Coolfatman
2011-03-08
打赏
举报
回复
如果查询次数少,滚几次就行了。
如果查询次数多,那么实现comparator 把对象排序,然后用2分法定位即可。
如果真的太多。把对象放进数据库,然后建索引,查询就是了。
java通过坐标划分区域_
请教
一个
超级
算法
难题——java根据定位坐标计算区域问题!...
你的位置:问答吧-> JAVA-> 问题详情
请教
一个
超级
算法
难题——java根据定位坐标计算区域问题!
请教
一个
超级难题——java根据定位坐标计算区域问题!这些大概数据GIS方面的知识。问题描述:在
一个
房间里(以房间一角做原点(0,0,0))1. 使用定位装置得到一些坐标点(x,y),比如10个点,求10点框定...
java多级反馈队列进程调度,多级队列反馈调度
算法
请教
多级反馈队列调度
算法
...
请教
多级反馈队列调度
算法
????????????在某一操作系统中对进程调度采用多级反馈队列调度
算法
。现设定采用三级分数给小编了,小编来 0时刻A到达,进入I队列,执行2个时间段后,转向队列II,再执行了3个时间段后,B进程到达(A还剩下2个时间段). 5时刻B进入I队列,执行了2个时间段后(B还剩下2个时间段),进入II队列,此时进程C到达。为什么说多级反馈队列调度
算法
能较好的满足各方面多级反馈队...
数据结构之
算法
的时间复杂度和空间复杂度
时间复杂度的概念:在计算机科学中,
算法
的时间复杂度是
一个
函数,它描述了
一个
算法
运行所需要的时间。而
算法
所运行的时间是计算不出来的,
算法
运行的时间与基本操作运行的次数成正比。时间复杂度主要衡量的是
算法
的运行速度,空间复杂度主要亨利
一个
算法
所需要的额外空间。定义了
一个
整型,所以开辟的栈帧空间大小是4个字节,但是在空间复杂度中,我们计算的是变量的个数,所以时间复杂度为O(1)。使用大O渐进法表示。在计算时间复杂度时,并不需要计算准确的
算法
操作次数,只需要计算大概的操作次数,也就是在准确的次数上求极限。
最短路
算法
——Dijkstra
Dijkstra 在大多数最短路径问题中,Dijkstra
算法
是最常用、效率最高的。它是一种“单源”最短路径
算法
,一次计算能得到从
一个
起点 s 到其他所有点的最短距离长度、最短路径的途径点。 一、Dijkstra的
算法
思想 Dijkstra 的模型例如多米诺骨牌,你可以想象下面的场景: 在图中所有的边上,排满多米诺骨牌,相当于把骨牌看成图的边。一条边上的多米诺骨牌数量,和边的权值(例如长度或费用)成正比。规定所有骨牌倒下的速度都是一样的。如果在
一个
结点上推倒骨牌,会导致这个结点上的所有骨牌都往后面
2021-01-03
请教
一下水卡校验
算法
请教
一下水卡校验
算法
卡原始: 0区块:000026A2000000000000000000002B0C 1区块:000026A2000000000000000000002B0C 刷过以后 0区块:000025F6000000000000000000003B39 1区块:000025F8000000000000000000000FD1 确定第三 第四位为金额98.90 97.18 后面15 16应该为校验 ,但
算法
是怎么样呢?请大侠们指教! ...
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章