zoukankan      html  css  js  c++  java
  • 自动摘要

     我们试着降低此问题的复杂度。因为上述思路一再进行查找的时候,总是重复地循环,效率不高。那么怎么简化呢?先来看看这些序列:

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

        问题在于,如何一次把所有的关键词都扫描到,并且不遗漏。扫描肯定是无法避免的,但是如何把两次扫描的结果联系起来呢?这是一个值得考虑的问题。

        沿用前面的扫描方法,再来看看。第一次扫描的时候,假设需要包含所有的关键词,从第一个位置w0处将扫描到w6处:

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

        那么,下次扫描应该怎么办呢?先把第一个被扫描的位置挪到q0处。

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

        然后把第一个被扫描的位置继续往后面移动一格,这样包含的序列中将减少了关键词q0。那么,我们便可以把第二个扫描位置往后移,这样就可以找到下一个包含所有关键词的序列。即从w4扫描到w9处,便包含了q1,q0:

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

        这样,问题就和第一次扫描时碰到的情况一样了。依次扫描下去,在w中找出所有包含q的序列,并且找出其中的最小值,就可得到最终的结果。编程之美上给出了如下参考代码:

    //July、updated,2011.10.21。

    1. int nTargetLen = N + 1;           // 设置目标长度为总长度+1  
    2. int pBegin = 0;                     // 初始指针  
    3. int pEnd = 0;                       // 结束指针  
    4. int nLen = N;                       // 目标数组的长度为N  
    5. int nAbstractBegin = 0;           // 目标摘要的起始地址  
    6. int nAbstractEnd = 0;           // 目标摘要的结束地址  
    7.   
    8. while(true)  
    9. {  
    10.     // 假设未包含所有的关键词,并且后面的指针没有越界,往后移动指针  
    11.     while(!isAllExisted() && pEnd < nLen)  
    12.     {  
    13.         pEnd++;  
    14.     }  
    15.       
    16.     // 假设找到一段包含所有关键词信息的字符串  
    17.     while(isAllExisted())  
    18.     {  
    19.         if(pEnd – pBegin < nTargetLen)  
    20.         {  
    21.             nTargetLen = pEnd – pBegin;  
    22.             nAbstractBegin = pBegin;  
    23.             nAbstractEnd = pEnd – 1;   
    24.         }  
    25.         pBegin++;  
    26.     }  
    27.     if(pEnd >= N)  
    28.         Break;  
    29. }   

      小结:上述思路二相比于思路一,很明显提高了不小效率。我们在匹配的过程中利用了可以省去其中某些死板的步骤,这让我想到了KMP算法的匹配过程。同样是经过观察,比较,最后总结归纳出的高效算法。我想,一定还有更好的办法,只是我们目前还没有看到,想到,待我们去发现,创造。

    转载:http://blog.csdn.net/v_july_v/article/details/6890054

  • 相关阅读:
    548
    zookeeper的异常处理(Disconnected, SyncConnected, Expired)
    ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边)
    SQL Server 中VARCHAR(MAX)变量赋值引起的性能问题。
    查看mysql数据库版本方法总结
    Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    Ignite用户配置管理介绍
    ORACLE动态采样分析
    SQL SERVER 2012链接到SQL SERVER 2000的问题解决案例
    SQL SERVER 2005删除维护作业报错:The DELETE statement conflicted with the REFERENCE constraint "FK_subplan_job_id"
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4385966.html
Copyright © 2011-2022 走看看