【发布时间】:2016-02-13 10:21:11
【问题描述】:
我试图从一个简短的算法中理解时间复杂度和空间复杂度之间的区别。此代码采用列表/数组并返回出现奇数次的单个数字。在 Python 中:
def foo(array_of_ints):
hash_table = dict()
for i in array_of_ints:
hash_table[i] = hash_table.setdefault(i, 0) + 1
for key, value in hash_table.items():
if value%2 != 0:
return key
有两个循环遍历数组的长度。但是第一个循环只是在内存中创建一个哈希表/字典。时间复杂度也是 O(n^2),因为我们两次迭代长度为 n 的数组,还是时间复杂度和空间复杂度各为 O(n),因为第一个循环只是在内存中创建了一个新的数据结构?
【问题讨论】:
-
迭代 N 两次是 O(2*N) = O(N),而不是 N^2
-
不是答案,但算法可以改进为
O(1)空间,只需对所有整数进行异或运算并返回结果。 -
这是家庭作业吗?
-
你可以使用
hash_table = collections.Counter(array_of_ints)。 @user2357112:你的意思是return reduce(lambda acc, i: acc ^ i, array_of_ints)? -
@J.F.Sebastian:差不多。所有出现偶数次的元素都会取消。
标签: python algorithm time-complexity space-complexity