2013-03-10 64 views
0

该函数采用代表鹅卵石的字符数组,并将数组重新排列为RED,WHITE和BLUE字符。 重新排列时进行的交换次数也会返回。 如果输入合法,并且成功重新排列 ,该函数返回1。如果在 输入中找到非法字符,它将返回0。此代码在C中的最差情况复杂度

boolean processInput(char *pebbles, int *noOfSwaps){ 

    int low; 
    int mid; 
    int high; 

    *noOfSwaps = 0; 

    low = 0; 

    while (low < strlen(pebbles) && color(*(pebbles + low)) == RED) 
      low++; 

    high = strlen(pebbles) - 1; 

    while (high >= 0 && color(*(pebbles + high)) == BLUE) 
      high--; 

    mid = low; 

    while (mid <= high){ 

      if (color(*(pebbles + mid)) == RED){ 

        if (mid == low){ 

          low++; 
          mid++; 
        } 

        else{ 

          swap((pebbles + mid), (pebbles + low)); 

          (*noOfSwaps)++; 
          low++; 
          mid++; 
        } 
      } 

      else if (color(*(pebbles + mid)) == WHITE) 
        mid++; 

      else if (color(*(pebbles + mid)) == BLUE){ 
        if (color(*(pebbles + high)) == BLUE) 
          high--; 

        else{ 
          swap((pebbles + mid), (pebbles + high)); 
          (*noOfSwaps)++; 
          high--; 
        } 
      }  
      else 
        return 0; 
    } 
    return 1; 
} 

^^^上面有我的代码。只有一个功能。需要知道该功能的最坏情况复杂性和原因。谢谢!

+0

如果您希望人们回答,您应该在Stack Overflow上发布代码。只需粘贴,选择,然后按Ctrl + K。 – 2013-03-10 02:22:29

+0

请在此处包含该功能的相关文本。你也应该提供一些关于函数渐近复杂性的估计。 – Guvante 2013-03-10 02:23:21

+0

我的预测是O(n) – 2013-03-10 02:24:28

回答

1

当所有的鹅卵石都是红色的时,这条线至少会造成O(n) + O(color())。如果颜色是O(1)(这可能是),那么它只是O(n)

while (low < strlen(pebbles) && color(pebbles[low]) == RED) 
    low++; 

的代码的其余部分似乎只是检查每个元素的颜色一次,所以这将是O(n) + O(color())为好。

所以我打算用O(n)

编辑:从头开始,他在那个while循环中调用了strlen。我打算将其升级到O(n^2)。其中npebbles的长度。这很容易导致它回到O(n)。调用strlen()一次,并缓存该值。

+0

好吧,我很感谢这个答案。你是否100%确定这个当前代码的最坏情况复杂度是O(n^2)......我肯定有和kainaw一样的想法,它是O(n)。请回到我身边。 – 2013-03-10 03:08:26

+0

如果数组全部为红色,那么我复制到我的答案中的两行将采用'O(n^2)'。剩下的代码看起来是'O(n)'。 'strlen()'是一个'O(n)'操作,当所有事情都是红色的时候你会这样做。 – 2013-03-10 15:05:45