我认为这段代码是(logn)^2,因为每个findindex函数都需要logn深度,我们称之为logn时间?有人能证实这一点吗?我希望你们中的一个能把这当成一个小测验,帮我一下。
给定一个已旋转未知次数的n个整数的排序数组,编写代码在数组中查找一个元素。您可能假设数组最初是按递增顺序排序的。
# Ex
# input find 5 in {15,16,19,20,25,1,3,4,5,7,10,14}
# output 8
# runtime(log n)
def findrotation(a, tgt):
return findindex(a, 0, len(a)-1, tgt, 0)
def findindex(a, low, high, target, index):
if low>high:
return -1
mid = int((high + low) / 2)
if a[mid] == target:
index = index + mid
return index
else:
b = a[low:mid]
result = findindex(b, 0, len(b)-1, target, index)
if result == -1:
index = index + mid + 1
c = a[mid+1:]
return findindex(c, 0, len(c)-1, target, index)
else:
return result
这个算法应该是o(logn)
,但从实现的角度来看不是。
>
在您的算法中,您不是只选择左子数组还是右子数组,而是尝试使用这两个子数组,即O(N)
。
您正在对数组A[LOW:mid]
和A[mid+1:]
进行切片,后者是O(n)
。
这使得您的总体复杂性在最坏的情况下O(n^2)
。
假设数组中没有重复项,Python3中o(logn)
二进制搜索的理想实现如下所示-
A=[15,16,19,20,25,1,3,4,5,7,10,14]
low = 0
hi = len(A) - 1
def findindex(A, low, hi, target):
if low > hi:
return -1
mid = round((hi + low) / 2.0)
if A[mid] == target:
return mid
if A[mid] >= A[low]:
if target < A[mid] and target >= A[low]:
return findindex(A, low, mid - 1, target)
else :
return findindex(A, mid + 1, hi, target)
if A[mid] < A[low]:
if target < A[mid] or target >= A[low]:
return findindex(A, low, mid - 1, target)
else :
return findindex(A, mid + 1, hi, target)
return -1
print(findindex(A, low, hi, 3))
有些答案最初有这样的排序算法: 请注意,和都是全范围的,因此可以比大,也可以比小,所以它可以使成对的顺序正确,也可以使成对的顺序错误(实际上这两种顺序都正确!)。我认为这是一个错误(作者后来称之为错误),这会混淆数组,但它看起来排序正确。不过,原因并不明显。但是代码的简单性(范围很广,没有像冒泡排序那样的)使它变得有趣。 正确吗?如果是这样,它为什么起作用?它有名字吗? 带测试的Python实现:
我这里有一个算法。 点击这里查看算法图像 它的作用是遍历一个数组并找到3个最大值并返回它们的总和。例如,数组[1,2,3,4,5]将返回12(3 4 5=12)。 图像中的算法说它是O(nlogk)。但这是我无法理解的。 以下是我对图像中第一个循环的看法: Heap的方法“插入()”和“删除()”,它们都取O(logn)。所以在first for循环中,它通过添加它们的运行时来生成O(2*logn
问题内容: 除了标准,,和运营商; 但什么是这些均值(,,,)? 又如何操作? in返回正常的余数模量,但是仅当,为什么会这样?怎么办? 又如何操作?它有什么作用? 问题答案: :求幂 :异或(按位) :模数 :除以积分结果(舍弃余数)
机器人可以走三种不同长度的步:1厘米、2厘米、3厘米。编写一个递归算法,找出机器人可以通过的不同方式的数量“d”
问题内容: 它是通过以下方式创建的: 一段时间后,我发现: 因此,我发现该事件根本没有运行。 问题答案: 您的事件调度程序正在运行吗?用检查。 如果您没有用户“ event_scheduler”的进程“ Daemon”,则该进程未运行。 因此,启动事件调度程序: 另请参见http://dev.mysql.com/doc/refman/5.1/zh-CN/events- configuration.
观察:对于每个节点,我们可以重复使用它到目的地的最小路径,这样我们就不必重新计算它(dp)。此外,当我们发现一个循环时,我们检查它是否为负。如果不是,它不会影响我们的最终答案,我们可以说它没有连接到目的地(阉羊是否)。 伪代码: > 给定源节点u和目标节点v 初始化 Integer dp 数组,该数组存储相对于源节点的最小到达点节点的最小距离。dp[v]= 0,其他一切都是无限的 初始化boole