飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

楼主: F8LEFT

[C/C++] 写了个Sunday算法的实现....

    [复制链接]
  • TA的每日心情
    开心
    2015-8-2 16:07
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2015-4-15 20:22:00 | 显示全部楼层
    本帖最后由 F8LEFT 于 2015-4-15 20:23 编辑
    heihu 发表于 2015-4-15 19:11
    使用F8老师的Sunday算法还是没法查找到文件字符串,使用古老的方法到是可以找到的,请F8老是指点

         没啥好说的了,多少人为了提高算法的效率而不断的钻研。我这边因为环境问题所以测试得挺少的,所以估计有bug,跟踪一下改改就好了。     你的方法时间复杂度最坏为O(n^m),而我的最坏为O(n*m),经过查表修改的话最好可以提升到O(n),也就是说基本上把原来的Src从头到尾扫描一遍就知道有没有该子字符串。这两个算法效率不在同一个等级上,要咋比较。

    点评

    不是说我用发的那个查找代码来跟你的算法比较,在处理大数据的时候根本就没法比的,那个只能用来查数据量小的,在小数据情况下的话可能没有多少区别。因为用你的算法没查到所以用这个试了下  详情 回复 发表于 2015-4-16 03:01
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-2 16:07
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2015-4-15 20:55:43 | 显示全部楼层
    heihu 发表于 2015-4-15 19:11
    使用F8老师的Sunday算法还是没法查找到文件字符串,使用古老的方法到是可以找到的,请F8老是指点

    测了一下,是可以对大数据文件进行操作的,请检查一下用法有没有错。还有我的代码在今天曾经修改过一次,请注意更新。
    另外,关于我前面说的效率问题,还是用实际结果来表明吧:
    1. #include <iostream>
    2. #include <string>
    3. #include <fstream>
    4. #include <time.h>
    5. #include "Sunday.h"
    6. using namespace std;

    7. int memfind(const char *mem, const char *str, int sizem, int sizes);
    8. int main()
    9. {
    10.         //char Src[] = "fgjsderiodfda1546egdjkjdkfdadghh";
    11.         //char Sub[] = "fda";
    12.         /*char Src[] = {
    13.                 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0x1C, 0x65, 0x1F, 0x65, 0x1F, 0x65, 0xD1, 0x6D, 0xF1, 0xB6,
    14.                 0x5A, 0xDF, 0x16, 0xD5, 0xF1, 0xA6, 0x5F, 0x4E, 0x91, 0xDF, 0xB6, 0x51, 0xD6, 0xF5, 0x1A, 0x65,
    15.                 0xF1, 0x65, 0xBD, 0xF1, 0x65, 0x1F, 0x65, 0x16, 0xB5, 0x1F, 0xB6, 0x51, 0x65, 0x1E, 0x91, 0xDF,
    16.                 0x65, 0x89, 0x76, 0x51, 0x6F, 0x19, 0x84, 0xDF, 0x65, 0x1B, 0x6D, 0xF5, 0x1B, 0x6F, 0x8B, 0x4A,
    17.                 0xE9, 0x6F, 0x1B, 0x6D, 0xC5, 0xB1, 0x98, 0x76, 0x51, 0xD6, 0x57, 0x49, 0x8E, 0xA5, 0x61, 0xB9,
    18.                 0x81, 0x65, 0x1E, 0x41, 0xB6, 0x5F, 0x1D, 0x65, 0x1D, 0x64, 0x8D, 0x91, 0x65, 0xD1, 0x65, 0x6D
    19.         };
    20.         char Sub[] = {0x65,0x1F, 0x65};*/
    21.         ifstream ifile("F:\\新番\\第十七课.rar", ios::binary);
    22.         ifile.seekg(0, ios::end);
    23.         unsigned int szSrcLen = ifile.tellg();
    24.         ifile.seekg(0, ios::beg);
    25.         char* Src = new char[szSrcLen+1];
    26.         ifile.read(Src, szSrcLen);
    27.         ifile.close();
    28.         char Sub[] = {
    29.                 0x76, 0x41, 0xDB, 0x0C, 0xBF, 0x3C, 0x44, 0xAB
    30.         };
    31.         unsigned int dwTimeNew, dwTimeOld;
    32.         dwTimeNew = clock();
    33.         cout<<FSunday::Sunday(Src, szSrcLen, Sub, sizeof(Sub))<<endl;
    34.         dwTimeOld = clock();
    35.         cout<<"<FSunday::Sunday,耗时"<<dwTimeOld - dwTimeNew<<"ms"<<endl;
    36.         dwTimeNew = clock();
    37.         cout<<FSunday::SundayF(Src, szSrcLen, Sub, sizeof(Sub))<<endl;
    38.         dwTimeOld = clock();
    39.         cout<<"<FSunday::SundayF,耗时"<<dwTimeOld - dwTimeNew<<"ms"<<endl;
    40.         dwTimeNew = clock();
    41.         cout<<FSunday::SundayB(Src, szSrcLen, Sub, sizeof(Sub))<<endl;
    42.         dwTimeOld = clock();
    43.         cout<<"<FSunday::SundayB,耗时"<<dwTimeOld - dwTimeNew<<"ms"<<endl;
    44.         dwTimeNew = clock();
    45.         cout<<FSunday::SundayW(Src, szSrcLen, Sub, sizeof(Sub))<<endl;
    46.         dwTimeOld = clock();
    47.         cout<<"<FSunday::SundayW,耗时"<<dwTimeOld - dwTimeNew<<"ms"<<endl;
    48.         dwTimeNew = clock();
    49.         cout<<FSunday::SundayDW(Src, szSrcLen, Sub, sizeof(Sub))<<endl;
    50.         dwTimeOld = clock();
    51.         cout<<"<FSunday::SundayDW,耗时"<<dwTimeOld - dwTimeNew<<"ms"<<endl;
    52.         dwTimeNew = clock();
    53.         cout<<memfind(Src, Sub, szSrcLen, sizeof(Sub))<<endl;
    54.         dwTimeOld = clock();
    55.         cout<<"memfind,耗时"<<dwTimeOld - dwTimeNew<<"ms"<<endl;
    56.        
    57.         cout << "Hello world!" << endl;
    58.         delete []Src;
    59.        
    60.         system("pause");
    61.         return 0;
    62. }

    63. int memfind(const char *mem, const char *str, int sizem, int sizes)
    64. {
    65.         int da,i,j;
    66.         if (sizes == 0) da = strlen(str);
    67.         else da = sizes;
    68.         for (i = 0; i < sizem; i++)
    69.         {
    70.                 for (j = 0; j < da; j ++)
    71.                 {
    72.                         if (mem[i+j] != str[j])
    73.                                 break;
    74.                 }
    75.                 if (j == da)
    76.                         return i;
    77.         }
    78.         return -1;
    79. }
    复制代码
        测试文件大小124MB,Sub位置112359584(0x6B278A0),应该算是够大的了,测试结果如下:
    Z}]G~DW]XYIHYK6I53NW%%1.jpg
         注意一下,这个文件只有100来MB大小,时间相差近3倍,如果再弄大点的,子字符串再长点的话,时间差将会变得更大。所以,改进这个算法还是有必要的。比如,子字符串扩展到32位的时候结果如下:
    PSTE%%OPG(8_(Q50LH)()PT.jpg
        时间差在10倍以上!!!其余的就不多解析了

    点评

    这个速度我觉得应该不大可能,难道你用了多线程?  发表于 2015-6-3 12:12
    100Mb怎么做到30ms内呢?能否共享一个编译好的以供测试。谢谢  发表于 2015-5-25 10:28
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2023-10-31 21:39
  • 签到天数: 245 天

    [LV.8]以坛为家I

    发表于 2015-4-16 02:57:11 | 显示全部楼层
    测试时候是直接填写的要查找的字符串所以查找不到,要用十六进制才能查找,谢谢F8老师啦
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2023-10-31 21:39
  • 签到天数: 245 天

    [LV.8]以坛为家I

    发表于 2015-4-16 03:01:32 | 显示全部楼层
    F8LEFT 发表于 2015-4-15 20:22
    没啥好说的了,多少人为了提高算法的效率而不断的钻研。我这边因为环境问题所以测试得挺少的,所以 ...

    不是说我用发的那个查找代码来跟你的算法比较,在处理大数据的时候根本就没法比的,那个只能用来查数据量小的,在小数据情况下的话可能没有多少区别{:soso_e113:}。因为用你的算法没查到所以用这个试了下
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

    发表于 2015-5-24 15:34:09 | 显示全部楼层
    怎么将上面的组装在一起?就是组装成可以编译的源代码。
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

    发表于 2015-5-24 17:43:24 | 显示全部楼层
    本帖最后由 menglv 于 2015-5-24 18:18 编辑

    QQ拼音截图未命名.png
    120M的文件vb打开到数组,只需要250毫秒,这里打开居然用了9703ms,当然这一切都是在我的IBM X60里面测试的。
    我的X60用了ssd固态硬盘,win10只需要10秒以内启动。
    为什么第二个计时会那么长?

    点评

    第一、代码该如何封装,那是你的问题了。看你喜欢怎么封装就怎么封装吧。代码应该是没有问题的。 第二、读取文件一般是读一段判断一段的。至于你读文件为啥这么慢,我怎么会知道啊,检查一下自己的代码吧。 第三、  详情 回复 发表于 2015-5-24 23:01
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-2 16:07
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2015-5-24 23:01:37 | 显示全部楼层
    menglv 发表于 2015-5-24 17:43
    120M的文件vb打开到数组,只需要250毫秒,这里打开居然用了9703ms,当然这一切都是在我的IBM X60里面测试 ...

    第一、代码该如何封装,那是你的问题了。看你喜欢怎么封装就怎么封装吧。代码应该是没有问题的。
    第二、读取文件一般是读一段判断一段的。至于你读文件为啥这么慢,我怎么会知道啊,检查一下自己的代码吧。
    第三、看我代码中的注释,我想注释是足够的。SundayF是原始的Sunday算法!!!

    点评

    不好意思,原来五次的call都不一样!  发表于 2015-5-25 13:33
    原来我编译成debug了,编译成release会更快  发表于 2015-5-25 10:22
    我只是想知道你的五次测试,为什么第二次时间会长那么多?  发表于 2015-5-25 09:26
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

    发表于 2015-5-25 10:21:40 | 显示全部楼层
    本帖最后由 menglv 于 2015-5-25 10:25 编辑



    QQ截图20150525101300.png

    这里的测试文件是30Mb
    看来在比较复杂的查找SundayF还是有一定的优势的
    Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

    00000000   00 00 00 00 00 00 00 00  00 00 00 00 00 FD FD F0                ??
    00000010   00 00 00 00 00 00 00 00  00 00 00 00 00 FD FD F0                ??
    00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 FD FD F0                ??
    ......
    Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

    01DFFFC0   00 00 FD FD F0 00 00 00  00 00 00 00 00 00 00 00     ??         
    01DFFFD0   00 00 FD FD F0 00 00 00  00 00 00 00 00 00 00 00     ??         
    01DFFFE0   00 00 FD FD F0 00 00 00  00 00 00 00 00 00 00 00     ??         
    01DFFFF0   00 00 FD FD F0 00 00 00  00 00 00 00 00 FD FD F1     ??       ??

    当查找00 00 FD FD F0 00 00 00  00 00 00 00 00 FD FD F1时确实是Sunday最快。

    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

    发表于 2015-5-25 11:42:32 | 显示全部楼层
    本帖最后由 menglv 于 2015-5-25 13:33 编辑

    好像不是很方便改成模糊hex查找。
    有点明白了,原来那五个过程是不一样的,所以时间也不一样。
    总体来说还是一个很不错的算法。

    点评

    sunday算法有个不好的地方就是不知道怎么实现hex模糊查找,比如查找:12??656678??95  详情 回复 发表于 2015-6-4 17:12
    已更新。关于效率问题只能说你的电脑问题了  发表于 2015-6-4 17:05
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

    发表于 2015-6-4 17:12:16 | 显示全部楼层
    本帖最后由 menglv 于 2015-6-4 17:14 编辑


    menglv 发表于 2015-5-25 11:42
    好像不是很方便改成模糊hex查找。
    有点明白了,原来那五个过程是不一样的,所以时间也不一样。
    总体来说 ...

    不好意思,刚刚看到支持模糊查找了,强力支持楼主,下来测试一下效率。


    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表