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

程序结果

DeepSeek+Coze扣子搭建智能体(保姆级教程) 阅读详情

相关推荐

RFSOC实战解析(一):深入RF Data Converter的时钟与数据接口设计

本文深入解析RFSOC中RF Data Converter的时钟与数据接口设计,涵盖GHz采样、数据流处理、时钟树同步及AXI-Stream接口实战。通过详细案例和调试技巧,帮助工程师高效配置IP核,优化ADC/DAC性能,解决跨时钟域和信号完整性等关键问题。

weixin_30955617的博客 473

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

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

打怪升级 999

利用dxflib读写cad文件

本篇主要在qt做一个例子读取cad文件数据,使用的开源库是dxflib。用到dxflib的DL_CreationAdapter,DL_Dxf。DL_Dxf是用来读取.dxf文件的类,DL_CreatinAdapter是一个容器,当DL_Dxf加载.dxf文件后,就会响应DL_CreationAdapter这个类,读取cad数据。我们来看看...

weixin_33759269的博客 1984

POJ4093:倒排索引查询

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

pakho5211的博客 1075

别再手动折腾了!PICO Unity SDK 一键配置开发环境保姆级教程(含PDC串流调试)

本文详细介绍了PICO Unity SDK的一键配置功能,帮助开发者快速搭建VR开发环境。通过自动化配置流程,大幅减少手动设置时间,提升开发效率。文章还涵盖了PDC串流调试技巧和常见问题解决方案,是PICO VR开发的实用指南。

weixin_30335575的博客 454

光伏系统选型指南:5种主流MPPT算法优缺点对比(附选型流程图)

本文深入剖析了光伏系统中五种主流MPPT算法的核心原理与性能差异。通过对比扰动观察法、电导增量法、恒定电压法、模糊逻辑控制及人工智能算法在追踪精度、响应速度、实现成本与稳定性等方面的表现,为不同应用场景(如户用、工商业及大型电站)提供了清晰的选型决策流程图和实战指南,帮助工程师优化系统效率与投资回报。

weixin_29294597的博客 106

倒排索引查询

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

m0_57375647的博客 746

OpenCV安装配置教程VS2022(超级顺利)

博主最开始没打算写这篇博客,只是想简单的在网上找一下最新版的OpenCV的安装配置教程,适用于VS2022的,但是我搜了一早上,也没搜到一个能让我成功安装配置的,看了很多很多文章,根本就没有几篇有用的。所以没办法了,只能自己研究了,于是就整理了这篇博客,希望能帮到和我一样的人,这就是博主一直信奉的利他精神!

weixin_47367099的博客 5万+

求倒排索引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

Vue3 - 详细实现调用浏览器摄像头拍照并生成图片预览,支持将抓拍的图像保存到用户本地或上传到服务器、调取前置摄像头和后置摄像头,开启摄像头并进行拍照,vue实现调用摄像头,电脑或手机调用摄像头拍照

vue3,nuxt3,摄像头,vue3网站打开摄像头拍照,vue3项目调用摄像头实现拍照功能,拍照后怎么保存,照相后上传到后端服务器,开启摄像头黑屏,如何默认后置摄像头,网页开启电脑摄像头并照相,前置拍照,vue3如何调用手机摄像头进行拍摄,拒绝权限后不再弹出了,微信公众号网页,摄像头报错,拍照左右镜像反了,浏览器不兼容怎么办,vue3调用电脑端摄像头实时拍照,解决调用摄像头权限无法弹出,打不开摄像头,Vue3如何调用手机的摄像头,调用本地摄像头实现拍照,浏览器不弹摄像头权限了,如何不使用https运行测试

🏆 前端领域优质创作者 8654

<PLC><汇川>汇川PLC基于EtherCat协议使用转矩模式控制SV630N伺服驱动电机

本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如果有值得记录的内容,也会添加进来。

用沸腾的热血,支付我们的人生吧! 4160

poj 倒排索引查询

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

weixin_34223655的博客 374

如何理解下一代ERP 即:华为MetaERP

如何理解下一代ERP 即:华为MetaERP 华为的 MetaERP核心定位: 华为MetaERP是华为公司自主研发的下一代企业核心商业管理系统。它不仅仅是一个传统的ERP(企业资源规划)系统,更是一个面向未来、基于云原生、AI驱动、安全可信的企业核心管理平台。

金牌架构师 1142

POJ 4093:倒排索引查询

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

just_young的专栏 2827

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

poj4093:倒排索引查询

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

weixin_30852367的博客 174

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

pku_Coder的博客 945

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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、付费专栏及课程。

余额充值