编程之美----最短摘要的生成

Posted fenghualong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程之美----最短摘要的生成相关的知识,希望对你有一定的参考价值。

题意:假设给定的已经是经过网页分词之后的结果,词语序列数组为W。其中W[0], W[1], ... , W[N]为一些已经分好的词语。假设用户输入的搜索关键词为数组Q。其中Q[0], Q[1], ... Q[m]为所有输入的搜索关键词。

例如,我们可以看到这样一个序列:

w0, w1, w2, w3, q0, w4, w5, q1, w6, w7, w8, q0,  w9, q1

解法思路:

  第一次扫描时,假设包含所有关键词,将得到如下的结果(用 a 这种形式表示指向位置)

  w0, w1, w2, w3, q0, w4, w5, q1, w6, w7, w8, q0,  w9, q1

  保持第二个指针不变,将第一个指针指向往后移动,只要包含所有关键词,更新最小摘要序列。直到缺少一个关键词为止。

  第二次扫描就成了下面的结果:

  w0, w1, w2, w3, q0, w4, w5, q1, w6, w7, w8, q0w9q1

  这样,问题就和第一次扫描时碰到的情况一样了。依次扫面下去,在 W 中找出所有包含q的序列,并且找出其中的最小值,就可得到最终的结果

代码示例如下:

技术分享图片
 1 #include <stdio.h>
 2 #include<map>
 3 #include<string>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9 
10     char keyword[][3] = {"q0", "q1"};
11     char description[][3] = {"w0","w1","w2","w3","q0","w4","w5",
12                         "q1","w6","w7","w8","q0","w9","q1"};
13 
14     int kLen = sizeof(keyword)/sizeof(keyword[0]);
15     int dLen = sizeof(description)/sizeof(description[0]);
16     int N = dLen;
17 
18     int nTargetLen = N + 1; //设置目标长度为总长度加1
19     int pBegin = 0;         //初始指针
20     int pEnd = 0;           //结束指针
21     int nLen = N;           //目标数组的长度为N
22     int nAbstractBegin = 0; //目标摘要的起始地址
23     int nAbstractEnd = 0;   //目标摘要的结束地址
24     int cnt = 0;            //记录出现关键词的
25 
26     map<string, int> times; //记录各个关键词出现的次数
27     for(int i = 0; i < kLen; i++)
28     {
29         times[string(keyword[i])] = 0;
30     }
31 
32     while(1)
33     {
34         //假设包含所有的关键词,并且后面的指针没有越界,往后移动指针
35         while(cnt != kLen && pEnd < nLen)
36         {
37             if(times.count(description[pEnd]))
38             {
39                 if(times[description[pEnd]] == 0)
40                 {
41                     cnt++;
42                 }
43                 times[description[pEnd]]++;
44             }
45             pEnd++;
46         }
47 
48         while(cnt == kLen)
49         {
50             if(pEnd - pBegin < nTargetLen)
51             {
52                 nTargetLen = pEnd - pBegin;
53                 nAbstractBegin = pBegin;
54                 nAbstractEnd = pEnd - 1;//此处减一是因为45行多加了一个1
55             }
56 
57             if(times.count(description[pBegin]))
58             {
59                 if(--times[description[pBegin]] == 0)
60                 {
61                     cnt--;
62                 }
63             }
64             pBegin++;
65         }
66 
67         if(pEnd >= N)
68             break;
69     }
70 
71     for(int i = nAbstractBegin; i <= nAbstractEnd; i++)
72     {
73         printf("%s ",description[i]);
74     }
75     return 0;
76 }
View Code

参考:https://blog.csdn.net/heart_love/article/details/51576640

以上是关于编程之美----最短摘要的生成的主要内容,如果未能解决你的问题,请参考以下文章

字符串----最短摘要生成

Go并发编程之美-CAS操作

生成CPU使用率 sin 曲线 控制cpu使用率 编程之美

初见go语言——领悟陶神的go代码之美

Java并发编程之美读书笔记5-Java并发包中ThreadLocalRandom类原理剖析

Java并发编程之美读书笔记5-Java并发包中ThreadLocalRandom类原理剖析