免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: flw
打印 上一主题 下一主题

【原创】超强版 Trim 横空出世! [复制链接]

论坛徽章:
0
31 [报告]
发表于 2004-03-03 12:25 |只看该作者

【原创】超强版 Trim 横空出世!

从程序的简练角度讲,楼主的程序确简练到了顶点,不可能在用到更少的指针变量,思路也很不错,但是当输入的数据是"a                。。。 "的情况下,因为只有一个数据,copied指针却从头跑到了尾。在这一点上我认为不是很有效率,str指针要从头检到尾市一定的。而记录最后空格前的地址也是必需的。昨天向调试一下代码,但是喝多了。白天我写了一个程序,但怎么看都是楼主程序的孪生兄弟,看不出有什么特点。我从数据传输的方式上想到了另一个算法,我写出来,linux上我没有试。程序用到了一个指针copy,和3各整形变量,(是不是很浪费??/)
楼主的数据输入通常使用向前移动字符,我的想法很简单,不用移动数据,只是纪录有效数据的距离初始指针的位置,那样的话一定要有个变量保存他了,还有这个指针是纪录有效数据结尾,处理上和楼主的茶不过。
思路是:处理的数据分为两类,一类是字符等有效数据,另一类是空格等数据(另外我把NULL归为这一类)。这样对数据的处理就简单了,无非是要么有效,要么无效,很像高低电平??其实程序也正是借助这个思想,当数据读入第一个数据后,第二个数据与第一个数据相同,那么copy不动,因为都是一样的数据,但如果第二个数据与第一个数据不同,那么copy就会向相反的方向变化,这样解决了我说的那种不适合楼主程序的数据输入。copy不会跟在str会面走,只是需要他走的时候才走。
#include <stdio.h>;
int trim(char *str)
{
    char *copy= NULL;
    int changed=0;
    int sum=0;
    int firsttime=1;
   
    if (str==NULL) return 0;

    for(copy=str;*copy;str++)
    {
        if(*str==NULL) break;
        if (*copy!=' ')
        {
            if(*str==NULL) {copy=str;break;}
            if((*str!=' ')&&(*str!=NULL)) {changed=0;firsttime=0;}
            else changed=1;
            if(changed==1) copy=str;
        }
        else
        {
            if(*str==NULL) break;
            if((*str!=' ')&&(*str!=NULL)) changed=1;
            else changed=0;
            if(changed==1) {copy=str;firsttime=0;}
            if((changed==0)&&(firsttime==1)) sum+=1;
        }
    }
    *copy=0x0;
    return sum;
}

void main()
{
    char ss[]="          fsfdas   ffsa  df   ";
    int i=0;
    i=trim(ss);
    printf("%s!!!\n",ss+i);
}
不知晓率如何,我想可能没有指针快。

论坛徽章:
0
32 [报告]
发表于 2004-03-03 12:30 |只看该作者

【原创】超强版 Trim 横空出世!

BingBingNorth 的测试数据有点问题:

基本没有空格了, 前面一个空格, 后面一个空格,  这个情况很特殊.
BingBingNorth 的算法只对前面的空格和后面的空格采用 isspace, 而 flw 的算法则对每个字符都进行了 isspace, 于是就吃亏了.

如果前后空格很多, 估计情况会有变化.

就 BingBIng 这个例子, 我在 Redhat  AS 2.1上测了一下,  我的代码是最快的.

flw  4.7
BingBing 2.8
me 1.7

测试时间用 clock 比较好, time 只能精确到秒. 或者干脆用 unix 的  time 命令好了

论坛徽章:
0
33 [报告]
发表于 2004-03-03 12:59 |只看该作者

【原创】超强版 Trim 横空出世!

win_hate兄的代码的写法体现我前面说的第一点和第二点,也和《如何又简洁又安全地去掉字符串前面和后面的空符号?》中效率最高的算法不谋而合。
另外,用strlen()和memmove()的究竟效率高不高,这很难说,因为不知道底层究竟是怎么实现的,我原来以为这些操作都是用汇编写的,就像FH兄的帖子里写的那样,可是从结果看,应该是我错了。

论坛徽章:
0
34 [报告]
发表于 2004-03-03 13:31 |只看该作者

【原创】超强版 Trim 横空出世!

呵呵,刚看了一下Linux的strlen,不是用串指令实现的,可能是为了char的扩展性吧,采用的是逐char比较的方式,而memcpy是使用的串指令。

楼主的算法确实很不错了,建议加精。

论坛徽章:
0
35 [报告]
发表于 2004-03-03 13:38 |只看该作者

【原创】超强版 Trim 横空出世!

[quote]原帖由 "BingbingNorth" 发表:
win_hate兄的代码的写法体现我前面说的第一点和第二点,也和《如何又简洁又安全地去掉字符串前面和后面的空符号?》中效率最高的算法不谋而合。
另外,用strlen()和memmove()的究竟效率高不高,这很难说,因为不知

论坛徽章:
0
36 [报告]
发表于 2004-03-03 13:41 |只看该作者

【原创】超强版 Trim 横空出世!

isspace的真值条件为:HT,VT,CR,LF,FF五个特殊字符。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
37 [报告]
发表于 2004-03-03 13:48 |只看该作者

【原创】超强版 Trim 横空出世!

大家争论的结果正好说明了一个问题,
那就是说,简洁的程序未必运行得快,
而繁复的程序未必运行得慢。

而我们程序员们,通常有很多时间都在选择,到底是应该把程序写的更加简练一些,还是写的繁复一些呢?

正所谓仁者见仁,智者见智,不同的情况下,可能需要不同的策略,
比如说在某些受限系统中,可能多浪费一个变量的空间都会带来严重的后果,这时候呢,可能就需要空间复杂度低一些的代码。反过来,在其它的场合,可能需要其它的策略。


需要说明的一点是,由于我这个程序用的是指针来实现,而没有依赖字符串的任何特点(没有使用 strlen、strcpy、memcpy 等等),所以应该是可以移植到任何类似的数据类型中,比如链表。但是就目前而言,我还没有想到有什么其它地方能有类似的需求,所以也只是一句空话罢了。

还有一个观点需要说明,考虑到函数调用所需要的入栈、出栈的时间,所以我不习惯在循环中反复调用函数。就 isspace 而言,我虽然并不知道 isspace 内部是如何实现的(是不是又用了什么专用的指令?),但是直觉告诉我,isspace 并不会比直接比较的效率高。可能还会更低也说不定。

论坛徽章:
0
38 [报告]
发表于 2004-03-03 13:56 |只看该作者

【原创】超强版 Trim 横空出世!

原帖由 "flw"]还有一个观点需要说明,考虑到函数调用所需要的入栈、出栈的时间,所以我不习惯在循环中反复调用函数。就 isspace 而言,我虽然并不知道 isspace 内部是如何实现的(是不是又用了什么专用的指令?),但是直觉告诉我,isspace 并不会比直接比较的效率高。可能还会更低也说不定。[/quote 发表:


isspace 是一个宏, 确实要慢一些, 因为如 FH 兄所言:

[quote]
isspace的真值条件为:HT,VT,CR,LF,FF五个特殊字符。


不过也可以用自定义的宏或直接写了, 我觉得 isspace 简洁一些而已.

更正, 我查了查资料,  isspace 应该是个函数.

论坛徽章:
0
39 [报告]
发表于 2004-03-03 14:15 |只看该作者

【原创】超强版 Trim 横空出世!

我的倾向是尽可能使程序简练一些,尽可能使别人能够容易看懂,对于那些对效率要求严格的场合,直接用汇编精雕细刻。

论坛徽章:
0
40 [报告]
发表于 2004-03-03 17:27 |只看该作者

【原创】超强版 Trim 横空出世!

我觉得程序月简单越短越好,
重要的是维护成本低,可以很好的解决问题!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP