基于STL的字典生成模块-模拟搜索引擎算法的尝试

该课题来源于UVA中Searching the Web的题目:https://vjudge.net/problem/UVA-1597

按照题目的说法,我对按照特定格式输入的文章中的词语合成字典,以满足后期的快速查找。

针对于字典的合成途径,我利用了STL中的map与set的嵌套形成了一种特定的数据结构来解析文章中的单词

 1 #include<map>
 2 #include<iostream>
 3 #include<set>
 4 #include<algorithm>
 5 #include<string>
 6 #include<cctype>
 7 #include<sstream>
 8 using namespace std;
 9 struct newpair
10 {
11     int article;
12     int line;
13     bool operator<(const newpair b) const
14     {
15         return this->line < b.line;
16     }
17 };
18 typedef map<string,set<newpair> > BIGMAP;
19 typedef set<newpair>::iterator SET_pair_ITER;
20 typedef map<string,set<newpair> >::iterator BIGMAP_iter;
21
22 BIGMAP maper;
23 string psd[1600];
24 int maxline;
25
26 int checkmaper()
27 {
28     BIGMAP_iter it;
29     for(it=maper.begin();it!=maper.end();++it)
30     {
31         cout<<(it->first);//string-type
32         set<newpair> cyc;
33         cyc=it->second;//set<newpair>-type
34         for(SET_pair_ITER iter=cyc.begin();iter!=cyc.end();++iter)
35         {
36             newpair ctn=*iter;
37             cout<<"  article "<<ctn.article<<" line "<<ctn.line<<endl;
38         }
39     }
40     return 0;
41 }
42
43 void buildmaper(string aim,int articlenum,int linenum)
44 {
45     newpair m;
46     m.article=articlenum;
47     m.line=linenum;
48     maper[aim].insert(m);
49 }
50
51 int readin()
52 {
53     int n;
54     char c;//input the \n
55     cin>>n>>c;
56     int cur=0;
57     for(int i=0;i<n;cur++)
58     {
59         getline(cin,psd[cur]);
60         if((int)psd[cur].find("***")!=-1){i++;continue;}//the next article
61         for(string::iterator it=psd[cur].begin();it!=psd[cur].end();++it)
62         {
63             if(isalpha(*it)) *it=tolower(*it);
64             else *it=‘ ‘;
65         }
66         stringstream ss(psd[cur]);
67         string chr;
68         while(ss>>chr) buildmaper(chr,i,cur);
69     }
70     return cur;
71 }
72
73 int main()
74 {
75     freopen("input.txt","r",stdin);
76     freopen("ans.txt","w",stdout);
77     maxline=readin();
78     checkmaper();
79     return 0;
80 }

以上代码涉及了较多C++知识与个别底层知识,下面进行列举:

1、stringstream常用操作

2、基本STL之map与set

3、结构体中的运算符重载

4、迭代器的操作

5、RB树实现map与set的基本原理

有关详细的实现方法请参照我的其它博客和上述代码。

在上述代码中唯一一个容易出现bug的位置是set的实现:由于set对输入的元素需要进行排序,所以必须在newpair结构体中重载<(operator)。

下面是运行图片:

输入如下:

4
one   repeat  repeat  repeat
A manufacturer, importer, or seller of
digital media devices may not (1) sell,
or offer for sale, in interstate commerce,
or (2) cause to be transported in, or in a
manner affecting, interstate commerce,
a digital media device unless the device
includes and utilizes standard security
technologies that adhere to the security
system standards.
**********
one two   repeat  repeat  repeat   repeat
Of course, Lisa did not necessarily
intend to read his books. She might
want the computer only to write her
midterm. But Dan knew she came from
a middle-class family and could hardly
afford the tuition, let alone her reading
fees. Books might be the only way she
could graduate
**********
one two three   repeat   repeat  repeat  repeat   repeat
Research in analysis (i.e., the evaluation
of the strengths and weaknesses of
computer system) is essential to the
development of effective security, both
for works protected by copyright law
and for information in general. Such
research can progress only through the
open publication and exchange of
complete scientific results
**********
one two three   four   repeat  repeat   repeat  repeat  repeat   repeat
I am very very very happy!
What about you?
**********

输出如下:

a  article 0 line 1
  article 0 line 4
  article 0 line 6
  article 1 line 16
about  article 3 line 34
adhere  article 0 line 8
affecting  article 0 line 5
afford  article 1 line 17
alone  article 1 line 17
am  article 3 line 33
analysis  article 2 line 22
and  article 0 line 7
  article 1 line 16
  article 2 line 23
  article 2 line 27
  article 2 line 29
be  article 0 line 4
  article 1 line 18
books  article 1 line 13
  article 1 line 18
both  article 2 line 25
but  article 1 line 15
by  article 2 line 26
came  article 1 line 15
can  article 2 line 28
cause  article 0 line 4
class  article 1 line 16
commerce  article 0 line 3
  article 0 line 5
complete  article 2 line 30
computer  article 1 line 14
  article 2 line 24
copyright  article 2 line 26
could  article 1 line 16
  article 1 line 19
course  article 1 line 12
dan  article 1 line 15
development  article 2 line 25
device  article 0 line 6
devices  article 0 line 2
did  article 1 line 12
digital  article 0 line 2
  article 0 line 6
e  article 2 line 22
effective  article 2 line 25
essential  article 2 line 24
evaluation  article 2 line 22
exchange  article 2 line 29
family  article 1 line 16
fees  article 1 line 18
for  article 0 line 3
  article 2 line 26
  article 2 line 27
four  article 3 line 32
from  article 1 line 15
general  article 2 line 27
graduate  article 1 line 19
happy  article 3 line 33
hardly  article 1 line 16
her  article 1 line 14
  article 1 line 17

其余略。。。。。。。。。。

OK

原文地址:https://www.cnblogs.com/savennist/p/12230612.html

时间: 2024-11-09 14:16:40

基于STL的字典生成模块-模拟搜索引擎算法的尝试的相关文章

基于FPGA的VGA可移植模块终极设计【转】

本文转载自:http://www.cnblogs.com/lueguo/p/3373643.html 略过天涯 基于FPGA的VGA可移植模块终极设计 一.VGA的诱惑 首先,VGA的驱动,这事,一般的单片机是办不到的:由于FPGA的速度,以及并行的优势,加上可现场配置的优势,VGA的配置,只有俺们FPGA可以胜任,也只有FPGA可以随心所欲地配置(当然ARM也可以,应用比较高吧). 初学者就是喜欢看炫的效果,往往会忍不住想玩.尤其玩FPGA的,没玩VGA就感到跟单片机没啥提升,因此VGA的驱动

SQL Server2005+、MySQL、Oracle 数据库字典生成工具

之前找的数据库字典生成工具基本上都依赖于 Office Com 组件,在不安装 Office的情况下无法使用.怒,于是自己用C# 写了一个. 特征如下:    一.支持的数据库 MS SQL Server 2005+.My Sql.Oracle    二.支持的文档类型 Html.CHM.Docx    三.无需安装Office即可生成 Docx 格式的Word文件    四.基于 .net framework 3.5 框架,电脑上需要安装 .net framework 3.5.       

传感器仿真平台——数据生成模块(三)

数据生成模块有下面这样一种情况: 对于不同的传感器仿真实验,所使用的数据类型,数据数量不一样. 如实验一是进行最大覆盖率实验,则他需要的数据格式可能是如下所示: 1 Class Sensor 2 { 3 public int x; 4 public int y; 5 public double direction; //方向 6 public double sweep;//扇形大小 7 } 实验二进行的是信号强度实验,则他可能还需要一个用来作为覆盖物的目标,如下: 1 Class Target

apache 单独生成模块

apache 单独生成模块 一般这种模块都是后期自己去生成的,比如一般在安装apache时都会--enable-so  ,允许动态加载模块. 这个模块你可以这样去生成. 1.下载一个与当前使用的apache一样版本的安装包. 2.解压安装包,然后进入其目录#cd /tmp/httpd-2.2.11/modules/mappers/#ls   ,此目录有个mod_speling.c文件 3.生成模块/usr/local/apache/bin/apxs -c -i -a mod_speling.c

基于字典序的组合生成算法

基于字典序的组合生成算法 2010-12-02 01:22:52|  分类: 离散数学 |  标签:离散数学  排列组合   |举报 |字号大中小 订阅 一. 问题描述 给定非空集合A,按字典序的方法生成集合A的所有组合.关于字典序的概念,这里不做严格定义,只是做一简单解释. 字典序是字符串比较的一种方法.例如两个字符串 abcd,abef,这两个字符串谁大? 显然,abef>abcd:如何得出这个结论的呢? 从左至右依次比较每一个字符,首先比较两个串的第一个字符,都是a,相等:其次比较两个串的

thinkphp3.2自动生成模块BIND_MODULE

thinphp3.2中提供了自定义生成模块与控制器的常量,分别是BIND_MODULE,BUILD_CONTROLLER_LIST 在 index.php 文件中定义 BIND_MODULE,BUILD_CONTROLLER_LIST 常量 1 2 3 4 5 6 7 8 9 10 11 // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG',True); // 定义应用目录 define('APP_PATH','./App/'); // 自动

模拟串口--基于STM8普通IO口的模拟串口驱动程序

基于STM8普通IO口的模拟串口驱动程序 标准串口通讯数据的格式为:起始位(1) + 数据位(8) + 校验位(1) + 停止位(1) 串口通讯另外一个重要的的部分是设置波特率,波特率就是1秒钟内串口所传输的Bit(位)数. 关于采样频率:为了较小读取或者发送串行数据的误差,我们采取了在N(我用的是4次)次中断中,取固定位置的读取的数据. 我以stm8中9600波特率计算的过程为例:(1秒钟传输9600位) 可以计算出传输1位所需要的时间 T1 = 1/9600 约为104us 由此可知,发送一

[Oracle]快速生成大量模拟数据的方法

快速生成大量模拟数据的方法: create table TEST(id integer, TEST_NUMBER NUMBER(18,6)); insert into TEST select i+j, i+j   from  (          with DATA2(j) as (                            select 0 j from DUAL                              union all                     

C++ STL 常用算术和生成算法

C++ STL 常用算术和生成算法 accumulate() accumulate: 对指定范围内的元素求和,然后结果再加上一个由val指定的初始值. #include<numeric> vector<int> vecIntA; vecIntA.push_back(1); vecIntA.push_back(3); vecIntA.push_back(5); vecIntA.push_back(7); vecIntA.push_back(9); int iSum = accumul