• 第 2 章 第 1 题 同位词问题 下问 Multimap实现


    问题分析

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

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

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

    解决思路

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

    代码实现

     1 #include <iostream>
     2 #include <fstream>
     3 #include <map>
     4 #include <string>
     5 
     6 using namespace std;
     7 
     8 #define MAX 26
     9 
    10 /*
    11  * 获取单词word的标识符并返回
    12 */
    13 string getID(string word)
    14 {
    15     string id(26, '0');
    16     for (string::size_type i=0; i<word.length(); i++) {
    17         id[word[i]-97]++;
    18     }
    19 
    20     return id;
    21 }
    22 
    23 int main()
    24 {
    25     /*
    26      * 打开字典文件
    27     */
    28     string filename;
    29     cout << "请输入字典文件名( 当前目录下 ): ";
    30     cin >> filename;
    31 
    32     fstream io;
    33     io.open(filename.c_str());
    34     if (!io) {
    35         cout << "打开文件失败" << endl;
    36         return 1;
    37     }
    38 
    39     /*
    40      * 获取查询单词及其标识符
    41     */
    42     string word;
    43     cout << "请输入查询单词: ";
    44     cin >> word;
    45     string wordID = getID(word);
    46 
    47     /*
    48      * 将字典文件存放进关联容器
    49     */
    50     multimap<string, string> m;
    51     string first, second;
    52     while (io >> second) {
    53         first = getID(second);
    54         m.insert(make_pair(first, second));
    55     }
    56     io.close();
    57 
    58     /*
    59      * 检索关联容器并打印检索结果
    60     */
    61     multimap<string, string> :: iterator it1, it2;
    62     it1 = m.lower_bound(wordID);
    63     it2 = m.upper_bound(wordID);
    64     while (it1->first != it2->first) {
    65         cout << it1->second << endl;
    66         it1++;
    67     }
    68 
    69     // 关闭文件指针
    70     io.close();
    71     
    72     return 0;
    73 }

    运行测试

    测试所用字典文件:

    运行结果:

    说明

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

  • 相关阅读:
    /proc/interrupts 和 /proc/stat 查看中断的情况
    publish and submit
    camera shading比例
    高负载linux调优
    linux网络socket 接口转
    深入分析linux调度机制
    大型网站架构之分布式消息队列
    Linux下高并发socket最大连接数所受的各种限制(详解)
    Linux服务器高并发实践经历
    oracle: 分割字符串,或者查找字段里面的关键字(关键字1,关键字2,关键字3)
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3318096.html
Copyright © 2020-2023  润新知