社区
数据结构与算法
帖子详情
如何对排过顺的多个索引进行查找?
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
打赏
收藏
如何对排过顺的多个索引进行查找?
有点象数据库的查询,例如 有下面数据 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 . 这个该如何做?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
如果只是索引的话是没有好方法的吧?如果是数据排过序后就可以二分查找了。
lucene-4.6.0全套jar包
Lucene
索引
工具全套jar包,版本4.6.0
爬虫搜索,简单的搜
索引
擎,java爬虫,搜
索引
擎例子,爬虫demo,java实现互联网内容抓取,搜
索引
擎大揭密
爬虫搜索,简单的搜
索引
擎,java爬虫,搜
索引
擎例子,爬虫demo,java实现互联网内容抓取,搜
索引
擎大揭密.java爬虫程序。web搜索。爬虫程序。sigar搜索,定时搜索互联网内容信息。
倒排
索引
是什么?
1.2.倒排
索引
倒排
索引
的概念是基于MySQL这样的正向
索引
而言的。 1.2.1.正向
索引
那么什么是正向
索引
呢?例如给下表(tb_goods)中的id创建
索引
: 如果是根据id查询,那么直接走
索引
,查询速度非常快。 但如果是基于title做模糊查询,只能是逐行扫描数据,流程如下: 1)用户搜索数据,条件是title符合"%手机%" 2)逐行获取数据,比如id为1的数据 3)判断数据中的title是否符合用户搜索条件 4)如果符合则放入结果集,不符合则丢弃。回到步骤1 逐行扫描,也就是全表扫描,随着数据
什么是倒排
索引
?
为什么需要倒排
索引
倒排
索引
,也是
索引
。
索引
,初衷都是为了快速检索到你要的数据。 每种数据库都有自己要解决的问题(或者说擅长的领域),对应的就有自己的数据结构,而不同的使用场景和数据结构,需要用不同的
索引
,才能起到最大化加快查询的目的。 对 Mysql 来说,是 B+ 树,对 Elasticsearch/Lucene 来说,是倒排
索引
。 Elasticsearch 是建立在全文搜
索引
擎库 Lucene 基础上的搜
索引
擎,它隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTf
倒排
索引
、正排
索引
,以及ElasticSearch对倒排
索引
的优化方法
正排
索引
与倒排
索引
首先,我们需要这两种
索引
方式是要干啥?其实任何一种
索引
模式,都对应的是不同的信息存储方式。这样不同的存储方式,主要是为了不同的查询要求而定的。正排
索引
和倒排
索引
就是如此,正排易维护,但搜索代价很大(耗时间);倒排搜索快,但建立倒排
索引
时间久、文档库的每次更新都意味着倒排
索引
的重建,故维护较麻烦。但由于倒排
索引
的建立可以放在线下,所以这一般来说不是太大的问题。 正排
索引
正排
索引
就是最普通的
索引
排序方式。正排
索引
也是采取key-value pair的方式对数据
进行
保存,key是doc-id
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章