为什么我的程序跑的很慢?


做oj的 检索字符串的题 有几个检查点超时 求看看这个程序哪些部分可以改进节约时间跑的更快 没法用
strlwr
题目是这样的
输入格式:

2 行。
第1 行为一个字符串,其中只含字母,表示给定单词;
第2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式:
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。

#include <stdio.h>
#include <string.h>
int main(void)
{
    char word[11], arti[1000001];
    gets(word);
    gets(arti);
    int i;

    for (i = 0; word[i] != '\0'; i++) {
        if (word[i] >= 'a')
            word[i] -= 'a' - 'A';
    }
    
    for (i = 0; arti[i] != '\0'; i++) {
        if (arti[i] >= 'a')
            arti[i] -= 'a' - 'A';
    }
    
    strcat(word," ");
    strcat(arti," ");
    
    int p=0,m;
    char *a;
    while(a=strstr(arti,word))
    {
        if(a==arti||*(a-1)==' ')
        {
            if(p==0) 
            m=a-arti;
            p++;
            *a=1;
        }
    }
    
    if(p==0)
    {
        puts("-1");return 0;
    }
    
    printf("%d ",p);
    printf("%d",m);
    return 0;
}

不看题目,就单单看你代码,应该是没用到什么算法,用的是最直接最普通的方法做,这样的方式在oj上某些测超时的点肯定过不了


string searching的问题暴力求解太慢了,常用的算法有

  • KMP

  • Rabin–Karp

下面是KMP算法,具体的原理还是去看《算法导论》吧

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void KMPsearch(char *pat, char *txt);
void computerLPS(char *pat, int M, int *lps);


int main(int argc, char *argv[]) {
    char *t = "test string searching text test";
    char *s = "test";
    KMPsearch(s, t);
    return 0;
}


void computerLPS(char *pat, int M, int *lps)
{
    int len, i;  //len用来指示当前LPS的长度
    lps[0] = 0; //当index为0时是epsilon,LPS长度是0
    len = 0;
    i = 1;
    while ( i < M ) { //计算从1到m-1的LPS
        //考虑abababca, 当i进行到5的时候, len=3此时时有最长的LPS aba
        //而p[i] = p[5] = p[len] = b 所以更新LPS为ababab, len=4
        if (pat[i] == pat[len]) {
            len += 1;
            lps[i++] = len;
        }
        //如果p[i] != p[len],那么此时的LPS长度要比到前一个index的LPS长度小
        //将len更新为lps[len-1]
        else {
            //这里的if不需要i++的原因是:
            //要么len一直迭代到0(没有找到一个LPS是以p[i]结尾的),
            //然后转入下个else分支
            //要么找到一个以p[i]结尾的LPS,那么p[i] == p[len],转入上个分支
            if (len != 0) len = lps[len-1];
            else lps[i++] = 0;
        }
    }
}
void KMPsearch(char *pat, char *txt)
{
    int M = strlen(pat);
    int N = strlen(txt);
    int *lps = (int *)malloc(M * sizeof(int));
    computerLPS(pat, M, lps);
    int i = 0;
    int j = 0;
    int count = 0;
    int firstindex = -1;
    printf("txt: %s\npattern: %s\n", txt, pat);
    while (i < N) {
        if (txt[i] == pat[j]) {i++; j++;} //如果匹配继续下一个
        if (j == M ) {
            printf("pattern found at index %d\n", i - M);
            count++;
            j = lps[j-1]; //右移pattern索引
            if (firstindex == -1)
                firstindex = i - M;
        }
        else if (i < N && txt[i] != pat[j]) {
            if (j != 0) j = lps[j-1]; //右移pattern索引;
            else i++; //没有lps
        }
    }
    printf("occur times: %d\nfirstindex: %d\n", count, firstindex);
    free(lps);
}

输出:

txt: test string searching text test
pattern: test
pattern found at index 0
pattern found at index 27
occur times: 2
firstindex: 0

大写的卧槽,你这程序不是一般的慢呀。。。你这程序有毒,半个小时,一点没动。。。



相关阅读:
刚入门PHP,是否有必要学习JAVA
JS prototype原型问题
关于移动端localstorage 手机浏览器无效果
PHP中的$_REQUEST和$_POST|$_GET有什么区别??
react这个错是什么意思,要怎么解决
.htaccess 文件导致的自动加载问题
百度数据图谱的插件
用angularjs怎么获取到data对象里的HeWeather data service 3.0对象里的数据?
router-link 阻止默认的点击事件么?
点击按钮的跳转ui-sref后进入的页面报错,是什么原因呢?
本地测试需要htpps,怎么解决?
jdk1.8关于持久化的api是哪个?为什么在javax包下找不到persistence这个类?
vue里模版如何转字符串
出现resolve-url-loader cannot operate:source-map error
css实现六边形带图片展示
关于react 一个问题(Render HTML string w/JSX expression)
gulp合并js代码问题
mysql怎么实现mssql的if exists() begin...end功能?
关于mongodb多表和检索查询
brew install php56-redis 安装错误



快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 两年之变 爸爸,你打吧 新闻稿标题怎么写 豫园灯会 那份爱,写在纸上 春季杂咏二首 哄女朋友开心的话_暖心的话语 原创歌词;我是不是你最爱的人 未来的我——克隆博士作文300字 小学五年级作文500字:我爱秋 绒毛之光 最后一份答卷! 排球 一件难忘的事作文600字 梧桐花作文200字 圣诞老人的故事 天使的歌声 小学五年级作文700字:我心中的康乃馨 给矿工叔叔的一封信作文700字 关于晚餐的作文350字 2016农村入党申请书范文 [诗歌]诗二首作文300字 一半光阴,一半心情 春景作文400字 一分耕耘,一分收获作文1000字 返乡农民工现状调研报告 浮殇记忆,搁浅在牵伴街角 最能吸引人的微信个性QQ说说,太有趣了 机会总是给那些有准备的人准备的 学校正在呻吟 蜗牛的快递公司 这天,不寻常 咀嚼生活的真味作文800字 守作文 对“债转股”有关问题的探讨 经典情话张爱玲 雨花一夏·北风其凉 关于感恩节的四年级优秀作文450字 幻城经典台词 我的小发明150字 卫生院主任工作总结 菠菜里脊肉片汤500字 老师的骗术 描写教室的好段 分享生命(转载)作文800字 《小猫杜威》的读后感作文1500字 未来的衣服作文350字 一座城池作文250字 人生总会有弯路,但弯路也有弯路的风景 竞职演讲稿(10)

Copyright © 2016 phpStudy |