我实现了对n长度列表中从1到n的整数进行计数。条件是不允许其他数据结构。仅处理原始列表。打印出整数及其计数
例如:
org_arr = [3, 4, 3, 1]
count_int(org_arr )
for i, item in enumerate(org_arr , 1):
print(i, '->', abs(item))
输出:
1 -> 1
2 -> 0
3 -> 2
4 -> 1
下面是我对count_int()的实现
def count_int(arr):
for i, check_index in enumerate(arr):
if check_index > 0:
arr[i] = 0
while True:
next_item = arr[check_index-1]
if next_item < 0:
arr[check_index-1] -= 1
break
elif next_item > 0:
arr[check_index-1] = -1
check_index = next_item
else:
arr[check_index-1] = -1
break
count_int()使用负计数,并且对于整数k(指定为1 <= k <= n)使用index = k-1来实现目标。运行后,原始数组org_arr
是[-1, 0, -2, -1]
我的问题是这个函数的大作用。是O(n)还是O(n ^ 2)?
在最坏的情况下,org_arr [0]的for循环需要while循环的n-1个循环,才能将org_arr [1]的值设置为org_arr [n-1]的负计数器。在那之后,while循环将永远不会被调用。因此,它是(n-1)个while循环+(n-1)个for循环。它将是2(n-1)。因此,它是O(n),但是我的朋友说它是O(n ^ 2),因为在for循环中有一个嵌套的while循环。
答案 0 :(得分:0)
您的分析是正确的。在许多情况下,嵌套循环会导致O(n ^ 2)性能,但是在这种情况下,同一索引在while
循环中不能为正两次。这意味着while
循环在所有迭代中的总运行时间最多为一个常数的n倍加上另一个常数的n倍,即O(n)(因为它可以在一个循环中检查多达n个元素,但是之后,如果再次点击同一元素,它将在固定时间内返回)。当然,它不能比O(n)更快地运行,因为for循环一次接触每个元素。