如何解决程序和运行时间确定
给定以下伪代码
D(A) // A is an array of numbers
U_Size = 1
for i=2 to length(A)
U=?
for j=1 to U_Size
if A[j]=A[i]
then U = FALSE
j = U_size
if U = TRUE
then U_Size = U_Size + 1
A[U_Size]=A[i]
return U_Size
- 替换“?”的最佳选择是什么?在第 4 行? (
U=?
)
以及这个程序到底做了什么 - 回答 - 我应该如何确定这个程序的运行时间和空间复杂度
我的回答:在第 4 行中,我初始化了 U -> U = TRUE
并认为程序将数组的所有不同元素排列在 arry 的开头并返回不同元素的数量
未解决的问题是:我应该如何确定这个程序的运行时间和空间复杂度(2)
解决方法
如果您不熟悉 Big O notation,我建议您阅读一下它,因为在计算机科学中,我们用它来表示时间和空间复杂度。
令输入数组的长度为n
。
此代码的时间复杂度在最坏情况下为 O(n2),最坏情况发生在所有不同数字的数组中。对于所有不同数字的输入数组,if 条件 if A[j] = A[i]
始终为假,因此 j
的内部循环从 1
循环到 U_size
对于每个 {{1} } 和 i
每次增加 U_size
。
如果仍然不清楚,那么您可以使用数学来理解它对所有不同数字的数组。
对于 1
和 i = 2
,U_size = 1
的内循环从 j
开始运行,即 1 次。
对于 1 to 1
和 i = 3
,U_size = 2
的内循环从 j
开始运行,即 2 次。
对于 1 to 2
和 i = 4
,U_size = 3
的内循环从 j
开始运行,即 3 次。
对于 1 to 3
和 i = 5
,U_size = 4
的内循环从 j
开始运行,即 4 次。
.
.
.
.
.
对于 1 to 4
和 i = n (length of array A)
,U_size = n-1
的内循环从 j
开始运行,即 n-1 次。
因此,如果将 i 的所有迭代的运行时间相加,1 to n-1
,你得到 1 + 2 + 3 + 4 + ... + n-1
,即 ~ O(n2)。
现在,空间复杂度。您已使用数组
n*(n-1)/2
本身在 A
循环之后进行分配。如果不考虑报告空间的输入数组,则空间复杂度为 O(1)。
如果您存储一个单独的数组来分配元素,即 j
,或者您将输入数组本身视为空间,那么您会说空间复杂度为 O(n)。 >
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。