确定时间和 Space 程序的复杂性
Determining Time and Space Complexity of program
所以我在实习中遇到了编码挑战,其中一部分是确定我的程序的 space 和时间复杂度。程序大致如下
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).
至于 space 的复杂性,我是否应该将所有变量使用的数字 space 相加?假设每个变量都是一个 int 并且循环 A 中有 3 个变量,循环 B 中有两个变量 space 复杂度是 (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(....)
| }
假设 的 grid
大小,一个大小为 的原始数据类型和 附加变量的总数 是3 在外层循环中,然后是 2 在内部循环中,总的 space 复杂度加起来为:
注意,假设上面给出的 和 的复杂性必须 显着低于 并且 完全独立于它。
您可能对此 link 提供的问题的进一步解释感兴趣。希望对您有所帮助(即使它只是近似值,因为您提供的细节比较粗糙),祝您好运!
所以我在实习中遇到了编码挑战,其中一部分是确定我的程序的 space 和时间复杂度。程序大致如下
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).
至于 space 的复杂性,我是否应该将所有变量使用的数字 space 相加?假设每个变量都是一个 int 并且循环 A 中有 3 个变量,循环 B 中有两个变量 space 复杂度是 (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(....)
| }
假设 grid
大小,一个大小为
注意,假设上面给出的
您可能对此 link 提供的问题的进一步解释感兴趣。希望对您有所帮助(即使它只是近似值,因为您提供的细节比较粗糙),祝您好运!