倒排文档

第一行输出该词所在的行数序号(多个的话,按照从小到大排序输出,中间空格隔开,序号从一开始记),如果没有出现,输出 -1

第二行输出频次排名R的单词出现的次数。

测试数据中的词频的分布如下,可见,排名第3的词,出现的次数为2

I,4

Beijing,2

in,2

love,2

.,1

Bejing,1

a,1

also,1

am,1

and,1

beautiful,1

is,1

life,1

live,1

student,1

there,1

travelling,1

这题很简单,参考答案是这样的:

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;

const int NN=100; //单词总数
const int MM=100000; //文本单行最大字符数

/* 文本单行 */
char ss[MM];
/* 统计频次 */
map<string,int> Mmap;
/* 用于最后的频次排序 */
struct node
{
    int x;
    string s;
}a[NN];

/* 用于最后的频次排序的排序规则 */
bool cmp(node xx,node yy)
{
    if(xx.x==yy.x)
        return xx.s<yy.s;
    return xx.x>yy.x;
}

bool fun(char *p,string temp)
{
    bool fg=false;  //此行中,是否有temp
    string t="";
    for(int i=0;*(p+i);i++)
    {
        if(*(p+i)==‘ ‘)
        {
            if(t.size()>0)
            {
                if(Mmap.count(t)==0)
                {
                    Mmap[t]=1;
                }
                else
                    Mmap[t]++;
                if(t==temp)
                    fg=true;
            }
            t="";
        }
        else
            t+=*(p+i);
    }

    if(t.size()>0)
    {
        if(Mmap.count(t)==0)
        {
            Mmap[t]=1;
        }
        else
            Mmap[t]++;
        if(t==temp)
            fg=true;
    }

    return fg;
}

int main()
{
    string temp;
    int n,R,tol=0;

    queue<int>ans; //存放查询单词出现的行数

    cin>>temp>>n>>R;
    getchar();

    for(int i=0;i<n;i++)
    {
        gets(ss);

       // cout<<"ss=="<<ss<<endl;

        if( fun(ss,temp) )
            ans.push(i+1);
    }

    map<string,int>::iterator itt = Mmap.begin();
    while(itt!=Mmap.end())
    {
        a[tol].s=(*itt).first;
        a[tol].x=(*itt).second;

      //  cout<<(*itt).first<<" "<<(*itt).second<<endl;

        tol++;
        itt++;
    }

    sort(a,a+tol,cmp);

    if(ans.size()>0)
    {
        int x=ans.front();
        ans.pop();
        printf("%d",x);
        while(!ans.empty())
        {
            x=ans.front();
            ans.pop();
            printf(" %d",x);
        }
        puts("");
    }
    else
        puts("-1");

    cout<<a[R-1].x<<endl;

    return 0;
}

倒排文档,布布扣,bubuko.com

时间: 2024-10-13 18:50:09

倒排文档的相关文章

向量空间模型实现文档查询(Vector space model to realise document query)

xml中文档(query)的结构: <topic> <number>CIRB010TopicZH006</number> <title>科索沃難民潮</title> <question> 查詢科索沃戰爭中的難民潮情況,以及國際間對其採取的援助. </question> <narrative> 相關文件內容包括科省難民湧入的地點.人數,受安置的狀況,難民潮引發的問題,參與救援之國家與國際組織,其援助策略與行動內容

sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID

转自:http://github.tiankonguse.com/blog/2014/12/03/sphinx-token-inverted-sort.html 外部排序 现在我们的背景是有16个已经排序的数据存在磁盘上.由于数据量很大,我们不能一次性全部读进来. 我们的目标是依次挑出最小的hit,然后交给索引引擎处理. sphinx 使用了 CSphHitQueue 这个数据结构. CSphHitQueue 你猜是什么? 队列? 恭喜你,猜错了.CSphHitQueue 是一个最小堆.且堆的最

Solr的总结文档

Solr的总结文档 一.    综述 预研使用solr已经一段时间,最近由于工作原因,在研究hadoop内的spark,因此solr就暂时告一段落,在此对前端时间对solr的使用和理解做一个总结,毕竟我现在也只略知皮毛,并未精通,未来再切换频道回索引时我也方便查阅 文章从solr安装使用.solr/lucene源码结构.索引理论基础这三个方向进行说明.文章将逐步完成. 二.    Solr安装使用 Solr是基于lucene的开源搜索平台,它可以对多种类型数据(pdf,txt等)建立索引,并提供

GPU方法做倒排压缩和交集计算

之前一直想读这篇,今天读了一下,颇有收获: 1.对文档按相似term聚类之后,delta较小,可以提高压缩率(similarity graph) 1.GPU一般可以有几百个核,有shared memory和global memory,shared memory相当于寄存器的速度,global memory速度较慢 2.有序数组上的搜索算法除了binary search还有interplation search(插值搜索),平均复杂度是O(loglogn),但memory access是binar

信息检索导论学习笔记 -- 第二章:词项词典及倒排记录表

2.1.1 文档分析及编码转换:      文档处理第一步,是将文件或web服务器上的一系列二进制字节序列转换为字符序列.      在实际中,首先要判断出文档的编码方式(机器学习分类.启发式等方法),确定文档的类型(word?zip?)然后将字节序列转换成字符序列. 2.1.2 文档单位(document unit)的选择:      常见的,将某个目录下的每个文件都看成一个文档.      但有些情况并非如此,比如我们可能希望将邮件.附件(附件中的文件)分开.      对于一个长文档而言,

关于信息检索-倒排文件系统架构解析

信息检索 信息检索我们常见的模型包括: bool model static langulage model vector space model 这里面主要涉及到的问题就是:query expresion,term correlation analysis,similarity computing,feature selection.那么对于similarity computing 阶段,主要的制约条件是内存限制,所以我们要改进term在document中的搜索时间,从而减少similarity

Lucene 4.X 倒排索引原理与实现: (2) 倒排表的格式设计

1. 定长编码 最容易想到的方式就是常用的普通二进制编码,每个数值占用的长度相同,都占用最大的数值所占用的位数,如图所示. 这里有一个文档ID列表,254,507,756,1007,如果按照二进制定长编码,需要按照最大值1007所占用的位数10位进行编码,每个数字都占用10位. 和词典的格式设计中顺序列表方式遇到的问题一样,首先的问题就是空间的浪费,本来254这个数值8位就能表示,非得也用上10位.另外一个问题是随着索引文档的增多,谁也不知道最长需要多少位才够用. 2. 差值(D-gap)编码

传销组织文档及操作事项

据个人所知,传销组织已基本遍布中国大部分省份:湖南,湖北,河南,河北,云南,贵州,四川,广东,广西,江西,江苏,重庆,陕西,安徽,福建等地. 传销组织文档如下: 业务洽谈 今天很高兴由我为你介绍我公司的基本情况,我们所从事的是连锁销售,我们合作的公司是*****贸易有限公司,公司本着团结务实,开拓进取的经营宗旨,把国际贸易,实业投资,高新技术引进开发,资讯服务,建立国际网点.网络融为一体.目前,我国的经济现状摆在眼前."产销瓶颈化"所以企业面临改革,造成了就业机会减少,社会压力增大,许

elasticsearch文档、索引的CRUD操作

elasticsearch概念 1. 集群:一个或者多个节点组织在一起 2. 节点:一个节点是集群中的一个服务器,有一个名字来标识,默认是一个随机的漫威角色的名字 3. 分片:将索引划分为多份的能力,允许水平分割和扩展容量,多个分片响应请求,提高性能和吞吐量 4. 副本:创建分片的一份或者多分的能力,在一个节点失败其余节点可以顶上 elasticsearch与mysql对应关系 index(索引) --- 数据库 type(类型) --- 表 documents(文档) --- 行 fields