KWIC-C/C++实现

Posted f_zyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KWIC-C/C++实现相关的知识,希望对你有一定的参考价值。

吐槽

最近我们 Java 老师不知道为啥非要我用 C/C++ 来实现 KWIC ,但是因为没有上过课,不知道这个东西是干嘛的,所以想网上 download 一下,然而,百度后发现,实在是没有什么能看的过眼的代码,修改他们的代码难度比自己写要大好多,于是,决定找一下定义自己动手实现一下。

描述

KWIC 索引系统接受一些行,每行有若干字,每个字由若干字符组成;每行都可以循环移位,亦即重复地把第一个字删除,然后接到行末; KWIC 把所有行的各种移位情况按照字母表顺序输出。

分析

上述关于 KWIC 的描述猛一看有些懵逼,因为并不知道这样做有啥子卵用,这种操作到底有啥存在的价值呢?为什么那么多软件设计课程要把他定为课堂讲义的经典呢?这些都不得而知了,为了让自己更好的理解,我找到了一个比较好的图解。

看到这里的样例,我想应该很容易理解了,首先按照行来读取,每行由若干单词组成,然后将所有行所有的可能移位结果放在一起进行排序,最后输出即可。需求很简单,不过这里的排序我并没有搞清楚具体什么排序规则……于是我就简操作,略微偷个懒,直接按照所有移位结果的单词的字典序进行比较,不考虑空格,考虑大小写的区别。代码很简单,区区一百行足矣,实在是搞不懂网上的那些大佬们为毛子要用二三百行来实现……

代码

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

struct line

    vector<string> vs;
 L;

vector<line> vl;

struct words

    int vl_pos, vs_pos;
;

vector<words> vw;

bool cmp(const words &a, const words &b)

    line La, Lb;
    for (int i = a.vs_pos; i < vl[a.vl_pos].vs.size(); i++)
    
        La.vs.push_back(vl[a.vl_pos].vs[i]);
    
    for (int i = 0; i < a.vs_pos; i++)
    
        La.vs.push_back(vl[a.vl_pos].vs[i]);
    

    for (int i = b.vs_pos; i < vl[b.vl_pos].vs.size(); i++)
    
        Lb.vs.push_back(vl[b.vl_pos].vs[i]);
    
    for (int i = 0; i < b.vs_pos; i++)
    
        Lb.vs.push_back(vl[b.vl_pos].vs[i]);
    

    int len = min((int)La.vs.size(), (int)Lb.vs.size());
    for (int i = 0; i < len; i++)
    
        if (La.vs[i] != Lb.vs[i])
        
            return La.vs[i] < Lb.vs[i];
        
    

    return La.vs.size() < Lb.vs.size();


string word;

int main()

    while (cin >> word)
    
        L.vs.push_back(word);
        if (getchar() == '\\n')
        
            vl.push_back(L);
            L.vs.clear();   //  此处可以优化
        
    

    for (int i = 0; i < vl.size(); i++)
    
        for (int j = 0; j < vl[i].vs.size(); j++)
        
            vw.push_back(i, j);
        
    

    sort(vw.begin(), vw.end(), cmp);

    for (int i = 0; i < vw.size(); i++)
    
        int vl_pos = vw[i].vl_pos, vs_pos = vw[i].vs_pos;
        int vs_sz = (int)vl[vw[i].vl_pos].vs.size(), c = 0;
        for (int j = vs_pos; j < vs_sz; j++)
        
            c++;
            cout << vl[vl_pos].vs[j] << (c == vs_sz ? '\\n' : ' ');
        
        for (int j = 0; j < vs_pos; j++)
        
            c++;
            cout << vl[vl_pos].vs[j] << (c == vs_sz ? '\\n' : ' ');
        
    

    return 0;

测试

按照上述图解里的样例进行测试,测试结果正确。

以上是关于KWIC-C/C++实现的主要内容,如果未能解决你的问题,请参考以下文章

Padavan老毛子固件:17CE插件集成

360 P2浏览器刷老毛子固件教程

小米路由器老毛子固件aria2配置

breed web控制台——刷老毛子(padavan)路由器固件

Padavan老毛子的二级路由,怎样设置与主路由在同一网段

北京联通光猫+老毛子固件路由器+Win7 IPV6设置