python - 以下代码的时间复杂度是多少?
问题描述
我对以下代码的时间复杂度感到困惑,我需要我能得到的所有帮助,因为我正在努力解决这个问题。
代码如下:
def herhalen(s,p):
pc = 0
while pc < len(s):
pd = pc + 1
while pd < len(s):
if s[pd] == s[pc]:
x = 0
while pd + x < len(s) and x < p and s[pc + x] == s[pd + x]:
x += 1
if x ==p:
return True
pd += 1
pc += 1
return False
解决方案
回答
假设N
是len(s)
外部循环具有O(N)
复杂性,因为从topc
获取所有值。第二个循环具有相同的复杂性:虽然从 开始,而不是从开始,但两个循环一起将具有复杂性。内部循环将具有复杂性(函数中的变量在哪里),因为循环将在到达时或到达时结束0
len(s) - 1
pd
pc + 1
0
O(N * N / 2) = O(N^2)
O(min(N, P))
P
p
pd + x
len(s)
x
p
所以,假设P
不是太小,如果我没记错的话,整体复杂度是O(N^3)
如果您难以理解为什么内部循环(从可迭代的外部循环而不是 开始0
)将复杂性乘以N
,而不是更小的东西,请看这个问题
重要的提示
for
顺便说一句,如果您使用循环而不是while
s ,我想您自己理解复杂性会容易得多。我会用以下方式重写代码(还包含一些小的样式改进):
def herhalen(s, p):
for pc in range(len(s)):
for pd in range(pc + 1, len(s)):
if s[pd] == s[pc]:
for x in range(p):
if pd + x < len(s) or s[pc + x] == s[pd + x]:
break
else:
return True
return False
使用你所写语言的所有力量:)
推荐阅读
- sql - 如何在 PostgreSQL 上存储 MM/YYYY 日期?
- javascript - 如何将 js 日期时间字符串转换为 python 日期时间对象
- java - FileNotFound 异常,即使文件在 java 中的监视服务期间就位
- ansible - 失败的!=> {"changed": false, "msg": "apt cache update failed"} 尝试
- python - 使用pandas python过滤并合并多个单元格为一个单元格Excel
- javascript - 使 Vuetify 的 v-select 更小,以便它可以很好地适合段落
- r - 有没有办法在 R 的 for 循环中进行滚动平均计算?
- tabulator - 制表器 - 获取包含顺序和大小的列
- c++ - Arduino上未知大小的数组
- casl - 获得正确的允许条件字段