【发布时间】:2012-10-04 17:55:48
【问题描述】:
我想使用分治法在O(log N) 时间内找到数组中的最大元素。我在planet-source-code 找到了一个工作代码。我把它翻译成 Python 如下:
def largest(arr,i,j):
global max1
global max2
if i == j:
max1 = arr[i]
else:
if i == j-1:
max1 = arr[i] if arr[i] > arr[j] else arr[j]
else:
mid = (i+j)/2
largest(arr,i,mid)
max2 = max1
largest(arr,mid+1,j)
if max2 > max1:
max1 = max2
当我使用数组[98,5,4,3,2,76,78,92],并将代码调用为
max1 = arr[0]
largest(arr,1,8)
我收到超出范围的列表索引错误。但是 C 代码返回正确的结果 98。谁能发现我在做什么错误?
【问题讨论】:
-
您没有使用完全相同的代码。 C 代码有 3 个 If 语句。
-
另外,该代码在 O(lg n) 时间内找不到最小值和最大值;事实上,这是不可能的。它至少需要线性时间,简单的线性扫描可能会更快。
-
你应该打电话给
largest(arr,0,7)或者largest(arr,1,7)。 -
@IonutHulub:如果数组是排序好的,可以在O(1)内完成。
-
每次在 python 中使用 global,程序员都会死
标签: python c algorithm divide-and-conquer