C中此代码的最坏情况复杂性

时间:2013-03-10 02:20:48

标签: c complexity-theory

此函数采用表示鹅卵石和的字符数组      将数组重新排列为RED,WHITE和BLUE字符。     重新排列时交换的数量也会返回。      如果输入合法且重新排列,则该函数返回1      成功。如果在中找到非法字符,则返回0      输入

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;
}

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

1 个答案:

答案 0 :(得分: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()一次,然后缓存该值。