【问题标题】:how do i get a lower time complexity with a nested loop如何使用嵌套循环降低时间复杂度
【发布时间】:2020-08-23 15:09:54
【问题描述】:

大家好,我正在研究 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)。有人建议我有一个系统来订购东西,但我不知道它是否足够好。 谢谢大家!

【问题讨论】:

  • 我不确定我们是否有足够的信息来真正回答这个问题。问题大小是多少?问题的不同实例是否有 8 以外的数字,或者数字 8 是否固定?
  • 没有问题没有固定大小,基本上我有一个structs数组,struct就像这个typedef struct {int index;字符字符串}。我必须按顺序打印字符串,因为 struct.index 是从 1 到 n 的随机数。使用嵌套循环需要花费太多时间来打印所有内容。如果我有 n=1000,最坏的情况将需要 O(nn) 复杂度,而且太多了!
  • 那么,你想要更快的执行还是想要更少的 O 复杂度?
  • stackoverflow 不是来设计你的代码的。请发布minimal reproducible example 以及您想要改进的地方
  • 更少的时间复杂度意味着在最坏的情况下更快的执行,对吧?无论如何,我需要的是一种不太复杂的方法来做同样的事情,但仍然无法找到它

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


【解决方案1】:

Quicksort 的平均复杂度为 O(n log(n))。 按索引对 (value, index) 进行排序,以便您可以在 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;
}

【讨论】:

  • qsort 数组比只遍历它要慢,所以如果不需要对数组进行排序,那么像 og 问题中那样使用 for 循环会更好,也更简单
  • 你是说两个嵌套for循环的时间复杂度比qsort的小吗?
  • 不,但是如果他对每个数组进行排序,他将在 for 循环中使用 qsort,我是说遍历每个数组比对每个数组进行排序更简单
  • 我的错,我误解了这个问题!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多