poj4093:倒排索引查询

总时间限制: 1000ms 内存限制: 131072kB
描述
现在已经对一些文档求出了倒排索引,对于一些词得出了这些词在哪些文档中出现的列表。

要求对于倒排索引实现一些简单的查询,即查询某些词同时出现,或者有些词出现有些词不出现的文档有哪些。

输入
第一行包含一个数N,1 <= N <= 100,表示倒排索引表的数目。
接下来N行,每行第一个数ci,表示这个词出现在了多少个文档中。接下来跟着ci个数,表示出现在的文档编号,编号不一定有序。1 <= ci <= 1000,文档编号为32位整数。
接下来一行包含一个数M,1 <= M <= 100,表示查询的数目。
接下来M行每行N个数,每个数表示这个词要不要出现,1表示出现,-1表示不出现,0表示无所谓。数据保证每行至少出现一个1。
输出
共M行,每行对应一个查询。输出查询到的文档编号,按照编号升序输出。
如果查不到任何文档,输出"NOT FOUND"。
样例输入
3
3 1 2 3
1 2
1 3
3
1 1 1
1 -1 0
1 -1 -1
样例输出
NOT FOUND
1 3
1

这题直接用stl的set集合可以解决,直接贴代码,但是这题在刚开始的时候遇到了bug详见下一篇随笔。

#include <iostream>
#include <stdio.h>
#include <set>
#include <algorithm>
using namespace std;

set<int> s[100];
int n,m;
int main()
{
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        int k;
        scanf("%d",&k);
        for(int j = 0; j < k; j++)
        {
            int x;
            scanf("%d",&x);
            s[i].insert(x);
        }
    }
    scanf("%d",&m);
    for(int i = 0; i < m; i++)
    {
        set<int> a,b;
        bool flag  = true;
        for(int j = 0; j < n; j++)
        {
            int f;
            scanf("%d",&f);
            if(f == 1&&flag)
            {
                flag = false;
                set<int>::iterator itr1 = s[j].begin();
                set<int>::iterator itr2 = s[j].end();
                while(itr1 != itr2)
                {
                    a.insert(*itr1);
                    itr1++;
                }
            }
            else if(f == 1&& !flag )
            {
                set<int>::iterator itr1 = a.begin();
                set<int>::iterator itr2 = a.end();
                while(itr1 != itr2)
                {
                    if(s[j].find(*itr1) == s[j].end())
                        //itr1 = a.erase(itr1);  这个地方有bug
                        a.erase(itr1++);
                    else
                        itr1++;
                }

            }
            else if(f == -1)
            {
                set<int>::iterator itr1 = s[j].begin();
                set<int>::iterator itr2 = s[j].end();
                while(itr1 != itr2)
                {
                    b.insert(*itr1);
                    itr1++;
                }
            }
        }
        set<int>::iterator itr1 = b.begin();
        set<int>::iterator itr2 = b.end();
        while(itr1 != itr2)
        {
            a.erase(*itr1);
            itr1++;
        }
        if(a.empty())
            printf("NOT FOUND\n");
        else
        {
            set<int>::iterator itr = a.begin();
            while(itr != a.end())
            {
                printf("%d ",*itr);
                itr++;
            }
            printf("\n");
        }
    }
    return 0;
}

poj4093:倒排索引查询

时间: 2024-09-18 23:45:08

poj4093:倒排索引查询的相关文章

poj 4093:倒排索引查询

poj 4093:倒排索引查询 题目: 总时间限制:  1000ms  内存限制:  131072kB 描述 现在已经对一些文档求出了倒排索引,对于一些词得出了这些词在哪些文档中出现的列表. 要求对于倒排索引实现一些简单的查询,即查询某些词同时出现,或者有些词出现有些词不出现的文档有哪些. 输入 第一行包含一个数N,1 <= N <= 100,表示倒排索引表的数目. 接下来N行,每行第一个数ci,表示这个词出现在了多少个文档中.接下来跟着ci个数,表示出现在的文档编号,编号不一定有序.1 &l

elasticsearch 查询 query

对于 类型是 text的字段,并且分析器指明是ik_max_word的会建立倒排索引 查询的分类: match查询:  会自动转换大小写,会分词, term查询: 不会转换和分词,只能值匹配 terms查询: 可以给字段值传入数组, 这里有没有分词呢??????????应该和term一样的只会值匹配吧,要不为啥叫terms,待验证 控制查询的数量,  from,和size属性指明,可以用来分页 match_all: 搜索索引下的所有type match_phrase: 满足分词后的所有词, sl

在不清楚数据表字段数据分布的情况下,应该创建什么类型的索引?

在讨论之前,先看看关系型数据库常见的索引类型: 1.位图索引,适用于该字段重复数据很多的情况: 2.B+树索引,适用于该字段重复数据不多的情况. 在不清楚数据表字段数据分布的情况下,应该创建什么类型的索引?个人觉得以上两种都不太适用,可以尝试使用第3类的索引: 3.倒排索引,在搜索引擎使用较多,适用于大多数的情况. 使用普通的文本文件格式存储倒排索引,格式为: value:rowid(行标识码),字段值对应value,rowid对应该行的标识码. 要注意的是,在创建倒排索引时,倒排索引的key需

Lucene4.6 把时间信息写入倒排索引的Offset偏移量中,并实现按时间位置查询

有个新的技术需求,需要对Lucene4.x的源码进行扩展,把如下的有时间位置的文本写入倒排索引,为此,我扩展了一个TimeTokenizer分词器,在这个分词器里将时间信息写入 偏移量Offset中.扩展了一个Filter,最后查询时通过filter把时间信息传进去过滤想要的时间范围之内的结果. Lucene倒排索引中分好的词有两个偏移量一个是按字符的偏移量(BeginOffset和EndOffset)另一个是以分词(Term)为一个单元的position,每增加一个词position加1,如果

IR中python 写倒排索引与查询处理

学习信息检索课程,老师让写一个倒排索引与查询处理的程序,于是抱着试试的心态自学python写了出来. 整个没有什么太大的算法技巧,唯一的就是查询处理那里递归函数正反两次反复查找需要多调试下. 数据结构: #-*-coding:utf-8-*- #!/usr/bin/python ''' 数据结构 建立索引 mydir 文档列表 onedoc 每一个文档 mydoc 当前查询的文档 mywords 建立索引的字典 myindex 0 文档下标 1 单词下标 2 次数 3... wordcntdic

【搜索引擎(二)】索引、倒排索引、哈希表、跳表

索引 其实在计算机中我们早已接触过跟索引有关的东西,比如数据库里的索引(index),还有硬盘文件系统中其实也有类似的东西,简而言之,索引是一种为了方便找到自己需要的东西而设计出来的条目,你可以通过找索引找到自己想要内容的位置.索引过程是: 关键字->索引->文档.在图书馆内的书分门别类,就是一种按类别来分的索引.当然索引还有很多其他的实现. 仅仅有索引的概念是不够的.虽然分门别类是一种方法,但是我们在拥有一堆文档的时候必须要有从文档到索引的规范过程,并且索引的结构要满足能够让人(或者计算机)

[Elasticsearch] 控制相关度 (二) - Lucene中的PSF(Practical Scoring Function)与查询期间提升

本章翻译自Elasticsearch官方指南的Controlling Relevance一章. Lucene中的Practical Scoring Function 对于多词条查询(Multiterm Queries),Lucene使用的是布尔模型(Boolean Model),TF/IDF以及向量空间模型(Vector Space Model)来将它们结合在一起,用来收集匹配的文档和对它们进行分值计算. 像下面这样的多词条查询: GET /my_index/doc/_search { "que

[Elasticsearch] 全文搜索 (一) - 基础概念和match查询

全文搜索(Full Text Search) 现在我们已经讨论了搜索结构化数据的一些简单用例,是时候开始探索全文搜索了 - 如何在全文字段中搜索来找到最相关的文档. 对于全文搜索而言,最重要的两个方面是: 相关度(Relevance) 查询的结果按照它们对查询本身的相关度进行排序的能力,相关度可以通过TF/IDF,参见什么是相关度,地理位置的邻近程度(Proximity to a Geo-location),模糊相似性(Fuzzy Similarity)或者其它算法进行计算. 解析(Analys

MapReduce实战--倒排索引

本文地址:http://www.cnblogs.com/archimedes/p/mapreduce-inverted-index.html,转载请注明源地址. 1.倒排索引简介 倒排索引(Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射.它是文档检索系统中最常用的数据结构. 有两种不同的反向索引形式: 一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表. 一个单词的