用户操作
[即时聊天] [发私信] [加为好友]
白良ID:baihacker
8932次访问,排名12530,好友268人,关注者0人。
baihacker的文章
原创 15 篇
翻译 0 篇
转载 0 篇
评论 35 篇
最近评论
wzyzb:有做了的吗?我也想参考 参考
xxgamexx:这些题有人做了么?

我想参考参考~
littlechen:哎,理解不了啊
留个言,慢慢理解
SeanBorland:抱歉,一不小心,发了两回,您删掉吧
SeanBorland:抱歉,一不小心,发了两回,您删掉吧
文章分类
    收藏
      相册
      技术类链接
      ROOTKIT
      看雪学院
      驱动开发网
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 KMP算法C++代码收藏

      新一篇: AVL(平衡树)C++代码(非递归) | 旧一篇: 金山招聘题目:编程计算从1到2008080808之间的整数有多少个含有数字7

      1. //by baihacker 
      2. #include <iostream>  
      3. #include <vector>  
      4. #include <functional>  
      5. #include <algorithm>  
      6. using namespace std;
      7. template<typename FType, typename SType>
      8. struct equal_cmp
      9. {
      10.   bool operator ()(const FType& _F, const SType& _S)const
      11.   {return _F == _S;}  
      12. };  
      13. template<typename RandAccessConcept,
      14.          typename EqualCmp>
      15. inline void     
      16. CalFailFunction(
      17.                 const RandAccessConcept& in,
      18.                 int len,
      19.                 vector<int>& ff,
      20.                 EqualCmp cmp
      21.                 )
      22.     ff.clear();
      23.     ff.reserve(len);
      24.     ff.push_back(-1);
      25.     for (int curr = 1, k = -1; curr < len; ++curr)
      26.     {
      27.         for (;k >= 0 && !cmp(in[k+1], in[curr]);
      28.                 k = ff[k]);
      29.         if (cmp(in[k+1], in[curr])) ++k;
      30.         ff.push_back(k);
      31.     }   
      32. }  
      33. template<typename FRandAccessConcept,
      34.          typename SRandAccessConcept,
      35.          typename  EqualCmp>
      36. inline int      
      37. KMPSearchFirst(
      38.                 const FRandAccessConcept& d,
      39.                 int   dlength,
      40.                 const SRandAccessConcept& p,
      41.                 int   plength,
      42.                 EqualCmp cmp,
      43.                 int start = 0
      44.                 )
      45. {
      46.     vector<int> ff;
      47.     CalFailFunction(p, plength, ff, cmp);
      48.     for (int i = start, j = -1; i < dlength; ++i)
      49.     {
      50.         while (j >= 0 && !cmp(d[i], p[j+1])) j = ff[j];
      51.         if (cmp(d[i], p[j+1])) ++j;
      52.         if (j == plength - 1) return i - plength + 1;
      53.     }
      54.     return -1; 
      55. }    
      56. template<typename FRandAccessConcept,
      57.          typename SRandAccessConcept,
      58.          typename EqualCmp>
      59. inline int      
      60. KMPSearchALL(
      61.                 const FRandAccessConcept& d,
      62.                 int   dlength,
      63.                 const SRandAccessConcept& p,
      64.                 int   plength,
      65.                 vector<int>& result,
      66.                 EqualCmp cmp
      67.                 )
      68. {
      69.     vector<int> ff;
      70.     CalFailFunction(p, plength, ff, cmp);
      71.     result.clear();
      72.     for (int i = 0, j = -1; i < dlength; ++i)
      73.     {
      74.         while (j >= 0 && !cmp(d[i], p[j+1])) j = ff[j];
      75.         if (cmp(d[i], p[j+1])) ++j;
      76.         if (j == plength - 1)
      77.         {
      78.              result.push_back(i - plength + 1);
      79.              j = ff[j];
      80.         }    
      81.     }
      82.     return result.size();
      83. }      
      84. int main()
      85. {
      86.     int d[] = {1,2,3,1,2,3,1,2};
      87.     char p[] = "\1\2\3\1\2";
      88.     vector<int> result;
      89.     int found = KMPSearchALL(d, 8, p, 5, result, equal_cmp<intchar>());
      90.     
      91.     for (int i = 0; i < found; ++i)
      92.         cout << result[i] << " ";
      93.     cout << endl;
      94.     
      95.     return 0;
      96. }    

      发表于 @ 2008年08月20日 19:36:00|评论(loading...)|收藏

      新一篇: AVL(平衡树)C++代码(非递归) | 旧一篇: 金山招聘题目:编程计算从1到2008080808之间的整数有多少个含有数字7

      评论

      #w3orc 发表于2008-08-21 14:48:51  IP: 60.30.224.*
      没有看懂,感觉我需要先把C++学好,要不没有办法理解你的思想
      #likexx 发表于2008-08-21 16:30:18  IP: 24.22.157.*
      楼上,你要看的是算法,不是代码。
      #chatterley 发表于2008-08-21 17:11:45  IP: 218.5.81.*
      优秀代码=不注释的代码=搞深奥代码
      ==========================
      既然要登陆才能评论,为什么还要验证码,搞不懂csdn的开发人员。
      #chatterley 发表于2008-08-21 17:11:50  IP: 218.5.81.*
      优秀代码=不注释的代码=搞深奥代码
      ==========================
      既然要登陆才能评论,为什么还要验证码,搞不懂csdn的开发人员。
      #chatterley 发表于2008-08-21 17:12:05  IP: 218.5.81.*
      优秀代码=不注释的代码=搞深奥代码
      ==========================
      既然要登陆才能评论,为什么还要验证码,搞不懂csdn的开发人员。
      #baihacker 发表于2008-08-21 18:45:51  IP: 218.89.48.*
      KMP这三个字就是最好的注释。
      #psusong 发表于2008-08-22 08:46:27  IP: 117.88.89.*
      谢谢!
      我收藏于:

      http://groups.google.com/group/nextplayer/web/kmp%E7%AE%97%E6%B3%95c__%E5%AE%9E%E7%8E%B0

      以后仔细研究
      #wei801004 发表于2008-08-22 10:10:40  IP: 61.135.152.*
      为什么要用模板和STL呢?
      #stdcpp 发表于2008-08-22 12:04:18  IP: 61.48.119.*
      very good.

      Could you add comments?
      #cjs_jackson 发表于2008-08-22 14:31:58  IP: 59.41.50.*
      N年没看过C++的代码了。
      #johnny_83 发表于2008-08-23 16:05:32  IP: 61.171.25.*
      算法是实现起来了,但是似乎有违背了原本的KMP算法思想了.KMP算法原本就是降低时间复杂度的,但是这里时间复杂度有提升了变为 O(n*n),不好.再说,这里的STL使用的也不怎么样.没有用到它的精髓部分,我想你这里使用迭代器是否更好些啊.这样才能够体现算法的泛性.
      #baihacker 发表于2008-08-23 18:13:15  IP: 218.89.48.*
      这里的算法复杂度不是O(n*n).
      用随机迭代器不如用随机访问概念来得直接,因为随机迭代器也是一种随机访问概念,所以用随机访问概念更为广泛,由于现在的C++还不支持这种范式,所以这里只能用一般的泛型来YY一下。
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © 白良