确定程序的时间和空间复杂性

时间:2018-04-27 22:25:27

标签: java algorithm time-complexity big-o space-complexity

所以我对实习有一个编码挑战,其中一部分是确定我的课程的空间和时间复杂性。该计划大致如下。

while(A){
  int[][] grid;
  // additional variables

 while(B){ //for loop involves iterating through grid
  // additional variables
  for(...) 
    for(....)
 }

  for(...) //for loop involves iterating through grid
    for(....)
}

所以我说的是整个程序的时间复杂度为(A N ^ 2 + B N ^ 2),因此得出的结论是它的摊销时间为O(N ^ 2)

至于空间复杂性,我是否应该将所有变量使用的数字空间相加?假设每个变量都是一个int,循环A中有3个,循环B中有两个,那么空间复杂度是(A * 24 + B * 16)?

1 个答案:

答案 0 :(得分:4)

为了避免错误,我倾向于使用一种方法,使你 为每一行写一个旁注 表示它执行的次数(更准确,你可以把它包括在最好和最坏的情况下)。

考虑到这个例子,这个想法可能如下:

num_exec   
        | while(A){
A       |   int[][] grid;
A       |   additional variables
        |
        |   while(B){ //for loop involves iterating through grid
AB      |     additional variables
ABN^2   |     for(...) 
        |       for(....)
        |   }
        |
AN^2    |  for(...) //for loop involves iterating through grid
        |    for(....)
        | }

要估算您的代码的时间复杂度,这些侧面注明数字的简单求和就可以了(就像您自己做的那样,尽管您获得的结果与我的略有不同):

至于你的内存复杂性,你的直觉适合8位整数。但是,如果我们讨论原始数据类型,您可以简单地将它们视为常量。因此,您应该更关注复杂的数据类型,即数组,因为它聚合了多个基元。总而言之,您需要考虑指定用于保存数据的元素的数据大小。

因此,应用于示例:

memory   
        | while(A){
ANk     |   int[][] grid;
A3k     |   additional variables
        |
        |   while(B){ //for loop involves iterating through grid
AB2k    |     additional variables
        |     for(...) 
        |       for(....)
        |   }
        |
        |  for(...) //for loop involves iterating through grid
        |    for(....)
        | }

假设grid大小,大小为的原始数据类型和其他变量的总数 3 < / strong>在外部循环中,然后在内部循环中 2 ,总空间复杂度加起来:

请注意,假设上面给出的复杂性必须明显少于而不是独立于它

您可能有兴趣进一步解释此link提供的问题。希望有所帮助(即使它只是近似因为你提供的更粗略的细节)并且祝你好运!