你如何计算 Big-O 符号的复杂性?任何人都可以在下面的这段代码中解释一下

how do you calculate the complexity in Big-O notation? can any body explain that on this code below

void KeyExpansion(unsigned char key[N_KEYS], unsigned int* w)
{
    unsigned int temp;
    for(int i=0; i< N_KEYS; i++)
    {
        w[i] = (key[N_KEYS*i]<<24) + (key[N_KEYS*i+1]<<16) + (key[N_KEYS*i+2]<<8) + key[N_KEYS*i+3];
    }

    for(int i = 4; i< EXPANDED_KEY_COUNT; i++) 
    {
        temp = w[i-1];
        if(i % 4 == 0)
            temp = SubWord(RotWord(temp)) ^ Rcon[i/4];

        w[i] = temp ^ w[i-4] ;
    }
}

Big-O 帮助我们根据输入进行分析。你的问题的问题是似乎有几个输入,它们可能相互关联,也可能不相互关联。

输入变量类似于 N_KEYSEXPANDED_KEY_COUNT。我们也不知道 SubWord()RotWord() 根据提供的内容做什么。

由于未提供 SubWord()RotWord(),为了便于计算,我们假设它们是常量。

你有基本的循环并迭代每个值,所以它非常简单。这意味着您有 O(N_KEYS) + O(EXPANDED_KEY_COUNT)。所以整体时间复杂度取决于两个输入,并且会受较大者的约束。

如果 SubWord()RotWord() 做任何非恒定时间的特殊操作,那么这将影响代码 O(EXPANDED_KEY_COUNT) 部分的时间复杂度。您可以通过乘以它来调整时间复杂度。但是根据方法的名称,听起来它们的时间复杂度将基于字符串的长度,将是另一个不同的输入变量。

所以这不是一个明确的答案,因为问题并不完全清楚,但我已尽力为您分解。