Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定程序的时间和空间复杂度_Java_Algorithm_Time Complexity_Big O_Space Complexity - Fatal编程技术网

Java 确定程序的时间和空间复杂度

Java 确定程序的时间和空间复杂度,java,algorithm,time-complexity,big-o,space-complexity,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 iteratin

因此,我在实习期间遇到了一个编码挑战,其中一部分是确定我的课程的空间和时间复杂性。程序大致如下

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(....)
}
因此,我所说的是,整个程序的时间复杂度为(AN^2+BN^2),因此得出结论,它的摊销时间为O(N^2)


至于空间复杂度,我是不是应该对所有变量使用的数字空间求和?假设每个变量都是一个int,循环A中有3个,循环B中有2个,那么空间复杂度会是(A*24+B*16)?

为了避免错误,我倾向于使用一种方法,让你为每一行做一个旁注,表示它执行了多少次(更准确地说,您可以同时包括最佳和最坏情况)

考虑到该示例,该想法可能如下所示:

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(....)
        | }
假设
网格
大小为,一个原始数据类型的大小为,并且附加变量的总数在外部循环中为3,在内部循环中为2,则总空间复杂度加起来为:


注意,假设以上给出的复杂性,必须大大小于并独立于此。


你可能有兴趣进一步解释这件事。希望这能有所帮助(即使只是因为你提供了更粗糙的细节而近似),祝你好运!

如果
while(B)
while(A)
,我看不出你怎么只有
O(n^2)
一个^2+BN^2
相当于一个^2+ABN^2,但是如果A和B导致常数不依赖于N,是的,整个程序是
O(N^2)
。从缩进中可以看出,您似乎有嵌套的网格迭代。这里没有足够的细节来确定复杂性。不使用边的方法是一个很好的主意。我从未见过这种情况。