- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是 edx 类(class)“计算机科学简介和使用 Python 编程”中的一个小问题。
def program1(x):
total = 0
for i in range(1000):
total += i
while x > 0:
x -= 1
total += x
return total
问题:在最佳情况下运行程序 1 需要多少步?用 n 表示你的答案,输入 x 的大小
答案:最佳情况:3003 最坏情况:5n+3003
我对答案 3003 感到困惑,因为根据我的说法,问题的最佳情况是如果 x =-1 并且其他语句执行的时间量是恒定的。因此声明
total =0 // takes a constant amount of time 1
for i in range(1000):
total += i // takes 1000*1 amount of time
return total // takes constant of time 1
因此答案应该是1000+2=1002
任何有正确解释的帮助将不胜感激..
最佳答案
如果我正确理解你的问题,我认为理解答案的关键是行 for i in range(1000):
正在做两个事情[< em>ed:请参阅下面的更新] 每次通过您忽略计数的循环:首先,它递增变量 i
,其次,它根据最大值检查它( 1000) 以查看循环是否完成。所以每次通过循环都应该算作 3 次操作。
最后,即使跳过循环,仍然需要一个操作来决定执行此操作,即检查 x
与 0
在行中: while x > 0:
.
这是最好情况下的计算方式:
def program1(x):
total = 0 // counts as 1
for i in range(1000): // counts as 2 * 1000
total += i // counts as 1 * 1000
while x > 0: // counts as 1 + N (note: so when x <= 0, still counts as 1)
x -= 1
total += x
return total // counts as 1
...加起来是 3003。
更新:
鉴于提供给您的最坏答案是5n + 3003
,我必须修改我的答案。
这意味着 while 循环中的 -=
和 +=
操作必须算作两个独立的操作(递增或递减和赋值)。如果是这样,则 for 循环中的 +=
操作也必须计为 2 个操作。如果是这样的话,使数字与提供的答案一致的唯一方法是会计是这样的:
def program1(x):
total = 0 // counts as 1
for i in range(1000): // counts as 1 * 1000
total += i // counts as 2 * 1000
while x > 0: // counts as 1 + N
x -= 1 // counts as 2 * N
total += x // counts as 2 * N
return total // counts as 1
我个人不同意将 +=
和 -=
算作抽象意义上的两个东西,因为我知道它们可以作为一个操作来完成程序集(假设所有值都在寄存器中),但 在 Python 中 它们实际上是两个操作。 (有关更多信息,请参阅下面链接中的第 4 个答案。)
要接受此计算,您还必须接受 for i in range(1000):
行每次通过循环仅计为 一个 操作。在意识到上面我错了之后,我找到了这个答案 here这有助于理解这一点。基本上,这是因为上限以及循环的迭代元素本身是固定的。
关于python - 对关于 Python 函数的最佳/最坏情况时间的回答感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24795595/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!