符串操作 倒排文档 (倒排索引) 代码修改(优化)

ConeIT 发布于 2014/06/19 16:56
阅读 450
收藏 0

 建立倒排索引的过程,需要对文件进行顺序的扫描,在这个过程中,我们一般还会统计一下词的分布情况,比如想知道频次排名第X的词(如果两个词的词频相同,则按照字母顺序排序)会出现多少次? 为方便实现,首先以简单的键盘输入形式逐行输入文件的内容,实现基本的功能之后,再将输入方式改成从文本文件中读取。

例如:输入 

第一行需要查询的单词W
第二行文本的总行数N
第三行频次排名R
剩下为文本(每个单词之间靠空格隔开) 

输出 

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

以下代码,为我所写,较为亢余,不清晰。希望帮我优化一下,更为简洁清晰,但希望依然使用C++语境

#include"iostream"
#include"string.h"
using namespace std;
#include"stdio.h"
int main()
{
	
	void px(int a[],int n);
	int i,j,t=0;
	int N,R;						
	char c;
	char W[15];							
	char input[10][50];						
	char words[30][15];					
	int num=0,k=0;						
	int times[30]						
		={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};			
	int sort[30];						
	int rank[30][10];					
	bool e[10]								
		={0,0,0,0,0,0,0,0,0,0};


	cout<<"请输入需要查询的单词:";
	cin>>W;
	cout<<"请输入文本总行数:";
	cin>>N;
	cout<<"请输入单词频次排名:";
	cin>>R;
	cout<<"请输入文本:"<<endl;
	fflush(stdin);
	for(i=0;i<N;i++)
		gets(input[i]);
	cout<<endl;

	for(i=0;i<N;i++)									
		for(j=0;input[i][j]!='\0';j++)					
		{
			c=input[i][j];								
			if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))		
			{
				words[num][k++]=c;
				if(input[i][j+1]=='\0')							
				{
					words[num++][k]='\0';						
					k=0;
					if(!e[i]&&!strcmp(words[num-1],W))			
					{	
						e[i]=1;
						printf("%d ",i+1);
					}
					for(t=0;t<num-1;t++)
						if(!strcmp(words[num-1],words[t]))		
						{
							times[t]++;
							num--;
							break;
						}
				}
			}
			else										
				if((input[i][j-1]>='a'&&c<='z')||(input[i][j-1]>='A'&&c<='Z'))		//若前一个字符为字母
				{
					words[num++][k]='\0';						
					k=0;
					if(!e[i]&&!strcmp(words[num-1],W))			
					{	
						e[i]=1;
						printf("%d ",i+1);
					}
					for(t=0;t<num-1;t++)
						if(!strcmp(words[num-1],words[t]))			//若当前单词在前面已出现
						{
							times[t]++;
							num--;
							break;
						}
				}
		}
	cout<<endl;

/*	for(i=0;i<num;i++)
	{	puts(words[i]);
		printf("%d\n",times[i]);
	}
*/
	j=0;k=0;t=0;

	for(i=0;i<num;i++)
		sort[j++]=times[i];			
	
	px(sort,num);						
/*
	for(i=0;i<15;i++)
		cout<<sort[i]<<' ';
*/
	for(i=0;i<num;i++)					
	{
		for(j=0;j<num;j++)			
		{
			if(sort[i]==times[j])		
			{
				if(sort[i]==sort[i-1])		
					rank[t-1][k++]=j;
				else
				{
					rank[t++][0]=j;
					k=0;
				}
			}
		}
	}

	t=rank[R][0];					
	cout<<"排名为"<<R<<"的单词出现次数为:"<<times[t]<<endl;
	cout<<"单词为:";
	for(i=0;i<10;i++)
	{
		if(rank[R][i]>0&&rank[R][i]<30)
			cout<<words[rank[R][i]]<<"	";
		else break;
	}
	cout<<endl;
	system("pause");
	return 0;
}

void px(int a[],int n)
{
	int i,j,t;
	for(i=1;i<n;i++)
	{
		for(j=i;j>0;j--)
		{
			while(a[j]>a[j-1])
			{t=a[j];a[j]=a[j-1];a[j-1]=t;}
		}
	}
}



加载中
返回顶部
顶部