当前位置: 首页 > 知识库问答 >
问题:

这个特定算法的运行时是什么?

薛宜
2023-03-14

我认为这段代码是(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

共有1个答案

毕宏盛
2023-03-14

这个算法应该是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