如何使用嵌套循环降低时间复杂度

时间:2020-08-23 15:09:54

标签: c loops for-loop time complexity-theory

大家好,我正在c上工作,我的代码看起来像这样,基本上是一个数组,并且在每个数组中[j]都有一个从1到8的数字,顺序不对,我正在尝试找出1是,并执行一些操作,然后找到2并执行其他操作,等等。直到数字8:

for(i=1;i<9;i++)
   for(j=0;j<8;j++)
     if(array[j]==i)
       //and operations to do but they are not needed now;
       

我正在寻找另一种方法来完成此任务,因为它的复杂性可能是(n ^ 2),因此花费的时间更少。有人给我提供了一种方便的系统来订购商品,但我不知道它是否足够好。 谢谢大家!

2 个答案:

答案 0 :(得分:3)

Quicksort的平均复杂度为O(n log(n))。 按索引对对(值,索引)进行排序,以便可以在O(1)中访问它们。

struct pair
{
    int val;
    int index;
};

int pair_compare(const void* a, const void* b)
{
    struct pair* x = (struct pair*)a;
    struct pair* y = (struct pair*)b;

    return x->val > y->val;
}

int main()
{
    int arr[8] = {4,2,1,3,6,5,8,7};
    
    struct pair* pairs = (struct pair*) calloc(8, sizeof(*pairs));

    int i;

    for(i = 0; i < 8; ++i)
    {
        pairs[i].val = arr[i];
        pairs[i].index = i;
    }

    qsort(pairs, 8, sizeof(*pairs), pair_compare);

    for(i = 0; i < 8; ++i)
    {
        printf("val: %d\tindex: %d\n", pairs[i].val, pairs[i].index);
    }

    free(pairs);

    return 0;
}

答案 1 :(得分:0)

建议代码有一个遍历8个结构的数组的外循环

对于每个包含8个结构的数组,请遍历该8个结构,根据每个结构的第一个字段中的值将索引放入该结构的数组中,并将其分成8个整数的单独数组。

然后是一个循环,循环遍历8个偏移量的数组,对指定的struct实例执行所需的操作。

相关问题