问题分析

  输入:一个任意的单词和一个内含多个乱序单词的字典文件

  输出:该单词在字典中的所有同位词

  约束:允许事先对字典进行预处理

解决思路

  上问的程序有个缺点 - 我们必须遍历完整个字典文件才能输出所有结果。现在下问允许我们事先对字典文件进行预处理,那么可以先对字典文件的单词按其标识符排序,这样相同标识符的单词都聚集在了一起,从而避免了对整个文件的检索。下面的代码用C++中的关联容器Multimap实现了这个思想。

代码实现

 #include <iostream>
#include <fstream>
#include <map>
#include <string> using namespace std; #define MAX 26 /*
* 获取单词word的标识符并返回
*/
string getID(string word)
{
string id(, '');
for (string::size_type i=; i<word.length(); i++) {
id[word[i]-]++;
} return id;
} int main()
{
/*
* 打开字典文件
*/
string filename;
cout << "请输入字典文件名( 当前目录下 ): ";
cin >> filename; fstream io;
io.open(filename.c_str());
if (!io) {
cout << "打开文件失败" << endl;
return ;
} /*
* 获取查询单词及其标识符
*/
string word;
cout << "请输入查询单词: ";
cin >> word;
string wordID = getID(word); /*
* 将字典文件存放进关联容器
*/
multimap<string, string> m;
string first, second;
while (io >> second) {
first = getID(second);
m.insert(make_pair(first, second));
}
io.close(); /*
* 检索关联容器并打印检索结果
*/
multimap<string, string> :: iterator it1, it2;
it1 = m.lower_bound(wordID);
it2 = m.upper_bound(wordID);
while (it1->first != it2->first) {
cout << it1->second << endl;
it1++;
} // 关闭文件指针
io.close(); return ;
}

运行测试

测试所用字典文件:

运行结果:

说明

  当字典文件中单词数量达到千万级别的时候,程序运行异常(很占CPU和内存且耗时巨大,而上问用的程序依然运行良好)。难道multimap容器不适合处理大批量的数据?原因仍在思考中 读者若有思路欢迎与我联系... ...

第 2 章 第 1 题 同位词问题 下问 Multimap实现的更多相关文章

  1. 《学习OpenCV》练习题第四章第八题ab

    这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合. 说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedet ...

  2. 《学习OpenCV》练习题第四章第三题b

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" /* *<学习OpenCV ...

  3. 《学习OpenCV》练习题第四章第三题a

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" #pragma comment ...

  4. 《学习OpenCV》练习题第四章第七题abc

    题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...

  5. HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)

    HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<= ...

  6. 64位Win8系统下安装Oracle12c

    经过3个小时的折腾,终于在64位win8系统下成功安装了Oracle 12c.这篇文章主要把安装过程中遇到的一些问题总结一下,以便帮助后来人参考. 首先我把我的机器的主要配制情况列举出来: 1. 系统 ...

  7. 64位WINDOWS系统环境下应用软件开发的兼容性问题(CPU 注册表 目录)

    应用软件开发的64 位WINDOWS 系统环境兼容性 1. 64 位CPU 硬件 目前的64位CPU分为两类:x64和IA64.x64的全称是x86-64,从名字上也可以看出来它和 x86是兼容的,原 ...

  8. 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

    原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...

  9. Installshield 64位操作系统下拷贝文件,如何重定向到32位的系统文件夹下

    原文:Installshield 64位操作系统下拷贝文件,如何重定向到32位的系统文件夹下 64位操作系统下拷贝文件重定向问题,在在复制代码前加上Disable(WOW64FSREDIRECTION ...

随机推荐

  1. Java面试题之Array和ArrayList的区别

    Array和ArrayList的区别: 1.Array类型的变量在声明的同时必须进行实例化(至少得初花数组的大小),而ArrayList可以只是先声明: 2.Array始终是连续存放的:而ArrayL ...

  2. SpringBoot重点详解--使用Junit进行单元测试

    目录 添加依赖与配置 ApplicationContext测试 Environment测试 MockBean测试 Controller测试 情况一 情况二 方法一 方法二 本文将对在Springboo ...

  3. uva 103 Stacking Boxes(最长上升子序列)

    Description    Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simp ...

  4. C语言的二次实验报告

    题目一 题目二 题目三 题目四 题目五 部分源代码 11-1求矩阵的局部极大值 #include<stdio.h>int main(){    int m,n,i=0,j=0,count= ...

  5. 【Visual Studio】The project appears to be under source control, but the associated source control plug-in is not installed on this computer

    [问题描述]用 Visual Studio 2013打开一个项目时,出现下面错误: [问题原因]参考 http://codeverge.com/asp.net.web-forms/the-projec ...

  6. linux shmget shmctl

    shmgetint shmget(key_t key, size_t size, int flag);key: 标识符的规则size:共享存储段的字节数flag:读写的权限返回值:成功返回共享存储的i ...

  7. linux 下 异步IO

    方法一:使用fcntl来置O_ASYNC位. 这个方法的效果是,当输入缓存中的输入数据就绪时(输入数据可读),内核向用F_SETOWN来绑定的那个进程发送SIGIO信号.此时程序应该用getchar等 ...

  8. jquery鼠标点击窗口或浮动层以外关闭层【阻止冒泡事件】

    $(".up-list a.th1").click(function(){ $(this).next("ul#up-list-ul").show(); }); ...

  9. mybatis trim

    eg: select * from user <trim prefix="WHERE" prefixoverride="AND |OR"> < ...

  10. SQLite数据库中rowid使用

    SQLite数据库中rowid使用   SQLite中每个表都默认包含一个隐藏列rowid,使用WITHOUT ROWID定义的表除外.通常情况下,rowid可以唯一的标记表中的每个记录.表中插入的第 ...