在C

2012-11-15 9 views
1

逆转串优化的代码我一直实施的C代码用于反转的字符串为:在C

  1. 循环我直到字符串或直到其长度
  2. 放置的一半的长度指针在字符串的末尾和开头
  3. 将它们逐个交换。

但我想要一个优化的代码,以减少这个问题的时间复杂性,除了我提到的。我试图谷歌搜索,但没有找到任何相关的解决方案。

+0

如果没有长度前缀或提前知道长度的其他方式,您*必须*扫描以在做任何事情之前找到结尾*(即'strlen()')。然而,一旦这次旅行完成,有许多方法可以做到这一点。 – WhozCraig

+3

我是唯一一个对sqrt(len)循环做什么来解决这个问题感兴趣的人(上面步骤#1的部分(c))? – WhozCraig

+3

@WhozCraig我认为这是针对长度= 4的特殊情况的一种优化。 – Caleb

回答

4

如果通过“时间复杂度”指的是不包含系数和低阶项的big-O符号,那么您将无法击败用于反转C字符串的简单O(n)算法。

如果您指的是特定机器(或机器类别)执行操作所用的时间,则有多种方法可优化反转。典型的优化包括loop unrolling,通过机器字而不是逐字符消耗字符machine word,并智能搜索终止的NUL字符。免费提供的GNU libc包含examples of such optimizations

上面的一些优化,比如循环展开,可以通过优化编译器自动实现。其他一些可能会在某些平台上产生反作用,或者它们的加速取决于字符串的大小。在某些情况下,手写优化可能会阻碍编译器自己优化代码的努力。唯一的办法就是确保不会让事情变得更糟,制定一个涵盖您的预期用法的基准,并在您进步的过程中仔细地对您的代码进行基准测试。

0
for(fctr=0,bctr=len-1;fctr<len/2;fctr++,bctr--) 
{ 
    temp=str[fctr]; 
    str[fctr]=str[bctr]; 
    str[bctr]=temp; 
} 

这可能工作的很快!