首页 新闻 会员 周边

很难也很着急的算法实现模型,关于x,y坐标的问题

1
悬赏园豆:200 [待解决问题]

问题描述:已知一个userId对应一个(x,y)坐标 

给定minX,maxX,minY,maxY,求出该范围内所有userId。 

考虑到大量的userId的坐标实时在变化更新,要求插入和 检索给定范围内的所有userid的效率要高 

坛子里的大牛看看吧,我实现的基本上效率太低了,请给出算法,万分感谢。 

问题补充: 首先要每个userid对应一个x,y坐标值的 当给定minX,maxX,minY,maxY后,查找出这个区域内所有的userid列表出来,新增userid的坐标和更新userid的坐标要高效,删除userid也一样,所以要考虑存储结构和查询效率 minX,maxX,minY,maxY不是整个坐标系的大小,整个坐标系大小为x*y (minX,maxX,minY,maxY)只是给定的查询条件,(minX<x,maxX<x,minY<y,maxY<y) 数据在程序启动时候从文件系统或者数据库读到内存,基本上都在内存存储,所以要构建这么样的一个模型出来,没有思路了,基本上是每个userid需要每秒需要更新一次坐标值,当然userid初期有4万多个吧,要考虑到10万哥userid,同时并发的话有1万个userid,查询的话,基本上是每秒查询一次 如果大家谁觉得可以私信联系我一下,万分感谢
comint的主页 comint | 初学一级 | 园豆:0
提问于:2011-01-03 13:20
< >
分享
所有回答(4)
0

当我没说过索引的事情, 这么频繁的更新 那么少的读取 放索引就废了...

-------------------------------------

如果是更新比新增多很多的话, 主要考虑更新操作, 如果是userid分布比较紧密,能做数组存放的话那么更新效率是O(n)+c ,要么用一般的二分查找更新效率是O(n*logn)+c

 

每秒一次的那个查询,如果不允许脏读的话, 可以考虑用快照,复制一部分数据结构以后统计,这样避免长时间堵塞更新操作,另外不知道你的程序对于数据有效性和时效性有没有什么要求

 

听说读写 | 园豆:777 (小虾三级) | 2011-01-03 14:22
0

请补充一下,存储到底是要求存储在内存还是数据库还是文件中?这个很重要?
另外你是怎么实现的,效率怎样?数据的规模有多大,即userid 的数量级是多少,你希望增删改查的效率达到多少?请明确这些问题,然后才好回答。

eaglet | 园豆:17139 (专家六级) | 2011-01-03 16:04
给定minX,maxX,minY,maxY后,查找出这个区域内所有的userid列表出来,新增userid的坐标和更新userid的坐标要高效,删除userid也一样,所以要考虑存储结构和查询效率 minX,maxX,minY,maxY不是整个坐标系的大小,整个坐标系大小为x*y (minX,maxX,minY,maxY)只是给定的查询条件,(minX<x,maxX<x,minY<y,maxY<y) 数据在程序启动时候从文件系统或者数据库读到内存,基本上都在内存存储,所以要构建这么样的一个模型出来,没有思路了,基本上是每个userid需要每秒需要更新一次坐标值,当然userid初期有4万多个吧,要考虑到10万哥userid,同时并发的话有1万个userid,查询的话,基本上是每秒查询一次
支持(0) 反对(0) comint | 园豆:0 (初学一级) | 2011-01-03 17:15
请看我刚刚写的这篇博客,代码什么都在里面,每秒钟可以更新 100万次,范围查询每秒钟可以查3000次。 http://www.cnblogs.com/eaglet/archive/2011/01/04/1925169.html
支持(1) 反对(0) eaglet | 园豆:17139 (专家六级) | 2011-01-04 09:49
0

考虑一下无锁并发跳表

软件猎人 | 园豆:235 (菜鸟二级) | 2011-01-04 09:43
考虑下
支持(0) 反对(0) comint | 园豆:0 (初学一级) | 2011-01-04 09:54
0

用二维树状数组吧

或者二维线段树

OpenOrz | 园豆:235 (菜鸟二级) | 2011-11-15 12:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册