poj 4093:倒排索引查询

C++ 倒排索引的实现 1.1基本介绍  倒排索引的概念很简单:就是将文件中的单词作为关键字,然后建立单词与文件的映射关系。当然,你还可以添加文件中单词出现的频数等信息。倒排索引是搜索引擎中一个很基本的概念,几乎所有的搜索引擎都会使用到倒排索引。 1.2 准备工作 ²  5个源文件 Test0.txt, Test1.txt,Test2.txt, Test3.txt, Test4.txt 里面包含了一些英文句 阅读详情

poj 4093:倒排索引查询


题目:
总时间限制: 
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

解题方案

我们先考虑两个子问题
1.求出两个有序递增数组的交集,并集,补集
我使用的是归并排序思想,只不过取得元素不同而已
2.求出多个有序递增数组的交集,并集
第一问题是这个问题的子问题,同时使用归并思想去做,如同擂台赛一样,每一个数组如同一个选手去争冠军
好了,子问题解决完毕,我们看看poj题目
1)对每一个索引表排序
2)对每一组查询,找出需要出现的文档号集合 wanted_list 和 不出现的文档号集合 not_wanted_list(这两个问题分别是上述第二个子问题求多个数组的交集,并集问题)
3)求出wanted_list 相对 not_wanted_list的补集即可 

代码c++如下
#include <iostream>
#include <list>
#include <algorithm>
#include <map>
#include <fstream>
using namespace std;

class Node
{
public:
	int word_id;
	int bit;
};

int compare(const void * a,const void * b)
{
	return *(int*)a - *(int *)b;
}

void print_list(list<int> mylist);
list<Node> initialize_list(int **search,int row,int N,bool need);
list<int> sub_data(list<int> wanted_list,list<int> not_wanted_list);
list<int> find_same_need(list<Node> mylist,int ** data,const int length);
list<int> find_same_not_need(list<Node> mylist,int ** data,const int length);
void read_data(int ** &data,int ** & search,int &M,int &N);

int main()
{
	int ** data;
	int ** search;
	int M,N;
	list<int> wanted_list;
	list<int> not_wanted_list;
	list<Node> wanted_node_list;
	list<Node> not_wanted_node_list;
	list<int> result;
	read_data(data,search,M,N);

	for( int i=0;i<M;i++ )
	{
		wanted_node_list = initialize_list(search,i,N,true);
		not_wanted_node_list = initialize_list(search,i,N,false);
		wanted_list = find_same_need(wanted_node_list,data,N);
		not_wanted_list = find_same_not_need(not_wanted_node_list,data,N);
		result = sub_data(wanted_list,not_wanted_list);
		print_list(result);
	}
	system("pause");
	return 0;

}

list<int> find_same_need(list<Node> mylist,int ** data,const int length)
{
	list<int> result;
	bool same ;
	list<Node>::iterator min_node;
	int min_article_id;

	while( true )
	{
		// 1. 检查当前文档号是否是一样的
		same = true;
		Node one = mylist.front();
		for(list<Node>::iterator node = mylist.begin();node != mylist.end(); node++)
		{
			if( data[one.word_id][one.bit] != data[node->word_id][node->bit] )
			{
				same = false;
				break;
			}
		}

		// 2. 结果如果不相同时,则需要增加最小的
		if( ! same )
		{
			min_article_id = INT_MAX;
			for(list<Node>::iterator node = mylist.begin();node != mylist.end(); node++)
			{
				if( data[node->word_id][node->bit] < min_article_id )
				{
					min_article_id = data[node->word_id][node->bit];
					min_node = node;
				}
			}
			min_node->bit ++;
			// 已经得到所有结果
			if( min_node->bit > data[min_node->word_id][0] )
				return result;
		}

		// 3. 存储一个结果
		else
		{
			result.push_back( mylist.front().bit );
			for (list<Node>::iterator node = mylist.begin(); node != mylist.end(); node++)
			{
				node->bit ++;

				// 已经得到所有结果
				if( node->bit > data[node->word_id][0] )
					return result;
			}
		}
	}
}

list<int> find_same_not_need(list<Node> mylist,int ** data,const int length)
{
	map<int,bool> myamp;
	list<int> result;
	for(list<Node>::iterator it = mylist.begin();it != mylist.end() ;it++)
	{
		while(it->bit <= data[it->word_id][0])
		{
			if( myamp.find(data[it->word_id][it->bit]) == myamp.end() )
			{
				myamp.insert(make_pair(data[it->word_id][it->bit],true));
			}
			it->bit ++;
		}
	}
	for(map<int,bool>::iterator it = myamp.begin();it!=myamp.end();it++)
	{
		result.push_back(it->first);
	}
	return result;
}




list<int> sub_data(list<int> wanted_list,list<int> not_wanted_list)
{
	list<int> result;
	list<int>::iterator wanted_it,not_wanted_it;
	wanted_it = wanted_list.begin();
	not_wanted_it = not_wanted_list.begin();
	while( wanted_it!= wanted_list.end() && not_wanted_it != not_wanted_list.end() )
	{
		if( *wanted_it < *not_wanted_it )
		{
			result.push_back(*wanted_it) ;
			wanted_it++;
		}
		else if( *wanted_it > *not_wanted_it )
		{
			not_wanted_it++;
		}
		else
		{
			wanted_it++;
			not_wanted_it++;
		}
	}
	while(wanted_it != wanted_list.end())
	{
		result.push_back(*wanted_it);
		wanted_it++;
	}
	return result;
}

list<Node> initialize_list(int **search,int row,int N,bool need)
{
	list<Node> result;
	Node node;
	if( need )
	{
		for( int i=0;i<N;i++ )
		{
			if( search[row][i] == 1 )
			{
				node.word_id = i;
				node.bit = 1;
				result.push_back( node );
			}
		}
	}
	else
	{
		for( int i=0;i<N;i++ )
		{
			if( search[row][i] == -1 )
			{
				node.word_id = i;
				node.bit = 1;
				result.push_back( node );
			}
		}
	}
	return result;
}

void print_list(list<int> mylist)
{
	if(mylist.size() > 0)
	{
		for(list<int>::iterator it=mylist.begin();it != mylist.end();it++)
		{
			cout<<*it<<" ";
		}
	}
	else cout<<"NOT FOUND";
	cout<<endl;
}

void read_data(int ** &data,int ** & search,int &M,int &N)
{
	ifstream reader;
	reader.open("data.txt");
	reader>>N;
	data = new int* [N];
	int m;
	for(int i=0;i<N;i++)
	{
		reader>>m;
		data[i] = new int[m+1];
		data[i][0] = m;
		for(int j=1;j<m+1;j++)
		{
			reader>>data[i][j];
		}
		qsort(data[i]+1,data[i][0],sizeof(int),compare);
	}

	reader>>M;
	search = new int * [M];
	for(int i=0;i<M;i++)
	{
		search[i] = new int[N];
		for(int j =0;j<N;j++)
		{
			reader>>search[i][j];
		}
	}
	reader.close();
}

数据测试 data.txt
3
3 1 2 3
1 2
1 3
3
1 1 1
1 -1 0
1 -1 -1

程序结果

vue 获取el-table多选的选中行 <el-table :data='tableData' ref="multipleTable" v-loading='loading' border max-height='700' style='width: 100%' size="mini"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column label 阅读详情

相关推荐

F5高可用HA配置详情

F5 HA详细配置

weixin_45843944的博客 3026

4093:倒排索引查询--bitmap并查集

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

打怪升级 999

告别理论推导!用Matlab工具箱5步搞定相机标定(附张正友法原理白话解读)

本文详细介绍了如何使用Matlab工具箱在5步内完成相机标定,无需复杂理论推导。通过棋盘格拍摄和Matlab的Camera Calibrator工具箱,用户可以快速获取相机的内参和外参,显著提升3D视觉的准确性。文章还提供了张正友标定法的白话解读,适合初学者和工程师快速上手。

weixin_42548816的博客 415

POJ4093:倒排索引查询

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

pakho5211的博客 1075

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署

本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。

vodka的博客 1014

事件相机(Event Camera)及相关研究简介——新一代相机?新的计算机视觉领域?

事件相机(Event Camera)及相关研究简介 事件相机是一个新型的类脑相机,是一个待开发的大领域。希望通过我的分享,能够有更多人来研究并将它更好地运用在我们的生活中~

Cyril的博客 5万+

倒排索引查询

2:倒排索引查询 查看提交统计提问 总时间限制: 1000ms 内存限制: 131072kB 描述 现在已经对一些文档求出了倒排索引,对于一些词得出了这些词在哪些文档中出现。 要求对于倒排索引实现一些简单的查询,即查询某些词同时出现,或者有些词出现有些词不出现的文档有哪些。 输入第一行包含一个数N,1 接下来N行,每行第一个数ci,表示这

m0_57375647的博客 746

离线安装vue脚手架,内网安装@vue/cli

公司开发环境使用内网,无法用外网,搭建环境的时候,发现内网系统没有安装vue脚手架,我搜了很多文章,发现他们的方法对我都不适用,然后就自己摸索,最终皇天不负有心人,终于被我安装上了,一下是我内网离线安装vue/cli的方法,希望能帮助到有需要的小伙伴! 因为npm被集成在nodejs中,而安装nodejs只需要把nodejs安装包copy到内网电脑安装就行,比较简单,这里就不多做演示。 在外网电脑上,使用npm install -g xxxx命令下载好我们所需要的各个安装包,比如: npm insta

Liberty_yes的博客 1万+

求倒排索引2

输入数据格式: 有两个文件data1.txt和data2.txt,文件中的内容就是普通的文本。每个单词就是一个关键词。 data1.txt的内容: zhangsan love zhouba lisi love zhengshi lisi love wujiu wangwu love zhaoliu lisi zhouba zhangsan sunqi data2.txt的内容: hel...

lodestone wisdom 291

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应 一般情况下,我们都是在 dialog 里面 放一个 list 控件,然后 用自己的类绑定自己的自绘对象,如同下面: 1.  在 dialog 里面 加一个 list 列表 2. 然后 绑定这个列表 哈哈...

mfreesky的专栏 2171

【半导体工业实战】C#.NET开发SECS/GEM协议上位机(完整可运行源码+全进制转换工具类+工业级通信封装)

在半导体这个高精尖的工业领域,SECS/GEM协议是设备通信的基石,而C#.NET凭借其稳定性、高效的字节处理能力、Windows工控机的深度适配,成为SECS上位机开发的最优选择。本文从半导体行业的专属认知出发,提供了完整的进制转换工具类、工业级的SECS通信封装、实战的报文解析与业务调用示例、半导体专属的避坑指南,所有内容均为真实项目经验的沉淀,无空洞理论、无AI冗余文字,所有源码均可直接编译运行、无缝移植到半导体项目中。半导体工控开发的核心,从来不是炫技,而是。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 898

poj 倒排索引查询

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34223655的博客 374

【LAMMPS学习】八、基础知识(2.1)2D模拟

此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。LAMMPS 源代码分发的examples目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。

荷塘阅色 1251

POJ 4093:倒排索引查询

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

just_young的专栏 2827

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

poj4093:倒排索引查询

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

weixin_30852367的博客 174

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

POJ 4093 倒排索引查询(STL set 的应用)

这个主要就是一个集合的交-差问题.由于数据量比较大,考虑用 STL 里面的SET 来当数据结构,存储每个单词出现的文档编号.我的思路是,找到一个为 1 的单词的下标,把这个单词的文档编号输出到 res 中,然后遍历,遇到0,什么也不做;遇到-1,就判断res中是否有这些文档,如果有,就删除;遇到1,就取交集,这里可以用一个 temp set集合来存储公共元素.(或者直接用两个迭代器在两个SET里面遍

pku_Coder的博客 945

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构与算法:倒排索引

1:倒排索引 查看提交统计提问 总时间限制: 1000ms 内存限制: 131072kB 描述 给定一些文档,要求求出某些单词的倒排表。 对于一个单词,它的倒排表的内容为出现这个单词的文档编号。 输入 第一行包含一个数N,1 <= N <= 1000,表示文档数。 接下来N行,每行第一个数ci,表示第i个文档的单词数。接下来跟着ci个用空格隔开的单词,表示第i个文档包含的单词。文档从1...

CSer 1894

倒排索引c语言,poj 倒排索引查询 - locusxt's blog - OSCHINA - 中文开源技术交流社区...

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

weixin_39621488的博客 346

1:倒排索引

总时间限制: 1000ms 内存限制: 131072kB 描述 给定一些文档,要求求出某些单词的倒排表。 对于一个单词,它的倒排表的内容为出现这个单词的文档编号。 输入第一行包含一个数N,1 接下来N行,每行第一个数ci,表示第i个文档的单词数。接下来跟着ci个用空格隔开的单词,表示第i个文档包含的单词。文档从1开始编号。1 i  接下来一行包含一个数M,1

复习。 2372

文档倒排索引算法实现

大数据(Hadoop)实验报告 第一章 大数据系统基本实验 第二章 文档倒排索引算法实现 实验目的 倒排索引(Inverted Index)被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,是目前几乎所有支持全文索引的搜索引擎都需要依赖的一个数据结构。通过对倒排索引的编程实现,熟练掌握MapReduce 程序在集群上的提交与执行过程,加深对MapReduce 编程框架的理解。 实验平台 操作系统:Ubuntu Kylin Hadoop 版本:2.10.1 JDK 版本:1.8

weixin_44898140的博客 2317

软件实习-倒排文档

/*5. 倒排文档 [问题描述] 倒排索引是搜索引擎中一个很基本的概念,几乎所有的搜索引擎都会使用到倒排索引。简单地说,倒排索引就是将文件中的单词作为关键字,然后建立单词与文件的映射关系,同时还需要记录文件中单词出现的频数等信息。 建立倒排索引的过程,需要对文件进行顺序的扫描,在这个过程中,我们一般还会统计一下词的分布情况,比如想知道频次排名第X的词(如果两个词的词频相同,则按照字母顺序排

Leo's Blog 1843

祸兮福兮?--疏忽引发的学习机遇

解答“倒排索引查询”题目(见后)时,我疏忽把题目中的“1[1],提交答案报告时遇到“RuntimeErrror”。 一开始不知道上述疏忽。于是我怀疑自己写的集合求交集、并集和差集的代码出问题。依稀记起STL中有求交集、求并集和求差集的代码。于是赶紧学习去。嗯,容易学。用以下代码就可以:                             set_intersection(exist_set

yedouble的专栏 611

倒排索引篇

1、海量数据处理之倒排索引 2、Lucene 4.X 倒排索引原理与实现: (1) 词典的设计 3、倒排索引构建算法BSBI和SPIMI Java实现 4、浅谈——倒排索引 5、倒排索引原理和实现

帅性而为1号的博客 864

理论基础 —— 索引 —— 倒排索引

【概述】 倒排表是对次关键码的一种索引表,其索引项包括以下两个结构: 次关键码:要记录的表项 记录号表:存储具有相同次关键字的所有记录的记录号,并且有序排列 这种索引不是由记录来确定数据项,而是由数据项来确定记录的位置。 【优缺点】 倒排索引的优点在于查找记录的速度很快,有时不用读取记录即可得到结果,而且由于其并未对文件进行修改,使用和维护都比较简单。 但由于倒排表中的记录号表长是...

Alex_McAvoy的博客 1001

倒排索引

1.简介 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。 倒排文件(倒排索引),索引对象是文档或者文档集合中的单词等,用来存储这些单词...

weixin_30809333的博客 332

poj 单词倒排

#include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; int main() { char t[100][100] = {" "}; int n = 0; while (cin &gt;&gt; t[n]) { n++; } for (int i = n - 1; i &gt;= 0; i--)...

vivaespana51的博客 354
上一篇: c 接口学习与实现
下一篇: poj 4092:牛仔裤
p11323
博客等级 码龄14年 79粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值