如何对排过顺的多个索引进行查找?

Meuck 2009-12-14 06:56:48
有点象数据库的查询,例如 有下面数据
ID 体重 日期
1 50 2009
2 30 2010
3 90 2004
4 10 2012

其中体重 日期都已排序,如下:
index1体重 4 2 1 3
index2日期 3 1 2 4

现在我要单独找 体重或日期都很容易.

但是如果我要找2004 到 2010体重在50公斤以内的数据,
要返回ID序号 1 2 . 这个该如何做?
...全文
159 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2009-12-18
  • 打赏
  • 举报
回复
不好意思,我以为你说的是16楼的方法。

你14楼提出的方法是,获得2个集合A和B,其中A是满足体重条件的,B是满足年份条件的。
然后取两个的并集,找出出现2次的元素,大概是这个意思吧?这样的效率大概是O(m+n),
其中m是集合A的长度,n是集合B的长度

我15楼说的遍历指的是,遍历集合A和B中较短的1个,在遍历中判断是否满足年份或体重的条件,
这样效率是O(min(m,n))

[Quote=引用 17 楼 zengwujun 的回复:]
回15楼的,人家的集合是10w级别,不能去遍历的。如果二分查找到的集合就几百个元素,我的做法优势非常明显。典型的空间换时间,当然楼主可以自己根据情况去做优化。
[/Quote]
绿色夹克衫 2009-12-18
  • 打赏
  • 举报
回复
如果二分只查到了几百个,用我说的方法,处理的数量绝对不会超过这个量级

[Quote=引用 17 楼 zengwujun 的回复:]
回15楼的,人家的集合是10w级别,不能去遍历的。如果二分查找到的集合就几百个元素,我的做法优势非常明显。典型的空间换时间,当然楼主可以自己根据情况去做优化。
[/Quote]
zengwujun 2009-12-18
  • 打赏
  • 举报
回复
回15楼的,人家的集合是10w级别,不能去遍历的。如果二分查找到的集合就几百个元素,我的做法优势非常明显。典型的空间换时间,当然楼主可以自己根据情况去做优化。
绿色夹克衫 2009-12-18
  • 打赏
  • 举报
回复
看来不懂的话,真是不能瞎说,希望没有误导LZ太长时间。

下面说说我自己想的一个方案。

如果体重跟年份区间不是很大的话,可以依靠预处理,提高以后的查询效率。
把这两项看做平面上的一个点,体重和年份分别是X和Y轴。以1为单位,将平面分为m*n份,
其中m是最大年份-最小年份的差,n是最大体重-最小体重的差,把这些点按照数值分到m*n份里,
此时如果要查体重在i-j之间,年份在k-l之间的,只需要到这个表里遍历x值在i-j之间,
y值在k-l之间的所有长宽为1的小正方形里面的点集就可以了,此时的效率大概是(j-i)*(l-k)

不过这里面会有很多空的格子,会影响查询的效率,此时可以通过DFS,将这些空的格子合并,
并建树,这个树结构实际上是这样的,相当于Dfs查询的递归数,每个格子看做1个节点,
连续的空格子,看做1个节点,而同他相邻的格子看做这个节点的子节点。
此时这个m*n的举行里的每个块都对应了1个节点,也存在多个小块同时对应1个节点的情况
查询时,i-j,k-l的节点中任选一块作为起始点,用bfs或dfs都行,向周围的节点开始搜索,
限定i-j和k-l的范围即可。这样效率基本上可以达到O(p),其中p是符合条件的节点的个数。

由于对空的块进行了合并,可以证明,空的块同非空的块的数量,是同一个量级的(也许是小于等于,没证明),因此效率是O(p)

[Quote=引用 11 楼 meuck 的回复:]
并查集 是合并两个不重复的集合, 我是要找两个集合重合的元素啊。。还有没人了?
[/Quote]
绿色夹克衫 2009-12-18
  • 打赏
  • 举报
回复
这样的话还不如直接遍历较短的集合,逐个筛选呢!效率还要高一些。

[Quote=引用 14 楼 zengwujun 的回复:]
1。用二分法查找index1的集合
2。用二分法查找index2的集合
3。把这两个集合串起来,如果是时间至上,来个O(n)的遍历,
例如,如果ID=2,则a[2]++, 如果ID=1000,则a[1000]++,最后看数组中的值为2的就是你要找的。
[/Quote]
zengwujun 2009-12-18
  • 打赏
  • 举报
回复
1。用二分法查找index1的集合
2。用二分法查找index2的集合
3。把这两个集合串起来,如果是时间至上,来个O(n)的遍历,
例如,如果ID=2,则a[2]++, 如果ID=1000,则a[1000]++,最后看数组中的值为2的就是你要找的。
houruifeng 2009-12-17
  • 打赏
  • 举报
回复
先排序在二分查找,速度会很快的!
Meuck 2009-12-17
  • 打赏
  • 举报
回复
并查集 是合并两个不重复的集合, 我是要找两个集合重合的元素啊。。还有没人了?
Meuck 2009-12-17
  • 打赏
  • 举报
回复
唉,楼上的意思没理解。

其实 问题也可以转为如何合并两个索引
目前我的方式比较粗暴,就是把需要的组合都搞成索引。

但就这样粗暴的方式也不太容易搞 :O
btq123 2009-12-15
  • 打赏
  • 举报
回复
排过序的,用二分法查找.
先用体重索引,查一次.
再用日期索引查一次.
然后取两者的并集.
Meuck 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 masterluo 的回复:]
如果只是索引的话是没有好方法的吧?如果是数据排过序后就可以二分查找了。
[/Quote]索引是排过序的,另外一个用二分查找好办,但问题是有多个索引.




Meuck 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 litaoye 的回复:]
LZ可以搜索一下并查集的问题,这方面我也不太了解,所以我也说不出怎么做,
但肯定是专门解决这种问题的。

引用 8 楼 meuck 的回复:
数据量是10W以上,反正比较大就是了。

[/Quote]
谢谢,我试试看。。
绿色夹克衫 2009-12-15
  • 打赏
  • 举报
回复
LZ可以搜索一下并查集的问题,这方面我也不太了解,所以我也说不出怎么做,
但肯定是专门解决这种问题的。

[Quote=引用 8 楼 meuck 的回复:]
数据量是10W以上,反正比较大就是了。
[/Quote]
Meuck 2009-12-15
  • 打赏
  • 举报
回复
数据量是10W以上,反正比较大就是了。
Meuck 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 btq123 的回复:]
排过序的,用二分法查找.
先用体重索引,查一次.
再用日期索引查一次.
然后取两者的并集.
[/Quote]
你太了解我了,握个手先,我一开始也是这么想的,问题就是卡在
"如何取两者的并集" 上面
丈八涯 2009-12-15
  • 打赏
  • 举报
回复
楼主的问题和答案好像对不上。
具体怎么处理应该要考虑数据量吧。
ahhh90h 2009-12-14
  • 打赏
  • 举报
回复
学习
go_Michael 2009-12-14
  • 打赏
  • 举报
回复
二分查找
复杂度能小点
MasterLuo 2009-12-14
  • 打赏
  • 举报
回复
如果只是索引的话是没有好方法的吧?如果是数据排过序后就可以二分查找了。

33,028

社区成员

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

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