python - 以下 Python 函数示例的大 O
问题描述
以下函数的 Big-O 是什么?
for a in range(n):
for b in range(n - a):
for c in range(n - b):
if a + b + c == 0:
break
if a + b == 0:
break
if a == 0:
break
return n + 1
我在想它会是 O(N^3),因为有一个三重嵌套的 for 循环,for 循环的每个组件都有一个 O(N) 的大 O。我的想法是正确的还是这个函数可能有不同的 Big-O?
解决方案
这个是 O(1)。这不是因为循环,而是因为逻辑。仔细查看范围值。Range 函数与单个参数一起使用时,会为您提供一个范围对象,其功能有点像列表 [0, ..., n]。对于那里的每个循环,每个 a、b 和 c 的第一个值将始终为 0。因此,您将始终遇到 a+b+c==0 中断。
我猜这是为了家庭作业?你总是可以尝试自己运行几次,看看输出是什么样子的。修改代码以执行以下操作可能会让您对函数内部发生的事情有一个不错的了解。
def sample_func(n):
total = 0
for a in range(n):
for b in range(n - a):
for c in range(n - b):
total += 1
if a + b + c == 0:
break
if a + b == 0:
break
if a == 0:
break
print( total)
return n + 1
for i in range(20):
sample_func(i)
推荐阅读
- kubernetes - Logs sent to console using logback configuration in java app, not visible in Kubernetes using kubectl logs
- javascript - Is it possible to block browser access to a text file, but still allow JavaScript access?
- javascript - 如何从网络浏览器录制音频并使用 JS 下载
- java - 在 Heroku 16 中安装 libgcrypt11
- javascript - Cordova android 应用 sqlite 插件
- google-material-icons - 如何获取 OUTLINE 样式的 Material Icons 的 SVG?
- python - 不同大小数组的距离
- apache-kafka - 有没有办法通过Kafka Connect将Kafka消息从Windows消费到服务器上的文件?
- java - 如何使用spring boot设置kafka消费者并发
- java - 让JSlider不断移动