雁过无痕

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::

《编程之美》读书笔记24  3.5 最短摘要的生成

当初看这道题时,看了好了几遍都没看懂。后来总算弄明白:给出的字符串是用其它程序分好词的,关键字符串也是用其它程序分好词的,而不是按用户直接输入的字符串。比如书上给的例子:“微软亚洲研究院  使命”,不是按空格分成两个关键词,“微软亚洲研究院”和“使命”,而是按其它程序分成:“微软”、“亚洲”、“研究院”和“使命”四个关键词。

“最短摘要”应该是指:包含所有关键字(关键字不要求按用户输入的顺序排列)的长度最短的摘要。书上的解法,把“最短摘要”理解成包含所有关键字且词个数最少的摘要。

   

弄清了问题,解决起来就很简单:

    1 反复读入字符串,直到碰到关键字(可以用setunordered_set)。

    2 更新该关键字字符串最近出现的位置。

    3 若已经找到所有的关键字,根据这些关键字的位置最小/最大值,计算摘要长度

      可以用set来维护这些位置值。

      (实际上,只要求维护位置的最小值,还可以自行实现一个堆结构,节省空间。)

根据位置值计算长度,需要先计算出分词后的字符串,在未分词的字符串的位置。

    4 记录长度最短的摘要

 

若有m个关键字,待查询字符串有n个,时间复杂度大概为:O(n*log m)

(关键字一般都很短,可以认为对关键字间的比较、计算哈希值时间复杂度为O(1)

  另外,将关键字映射到数字,减少字符串比较,能进一步提高效率。

 

 

最短摘要

 

 


作者: flyinghearts
出处: http://www.cnblogs.com/flyinghearts/
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2011-03-27 22:11 flyinghearts 阅读(1521) 评论(0)  编辑 收藏 引用 所属分类: 编程之美

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理