Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 算法:分治和时间复杂度O(nlogn)有什么关系?_Performance_Algorithm_Big O_Divide And Conquer - Fatal编程技术网

Performance 算法:分治和时间复杂度O(nlogn)有什么关系?

Performance 算法:分治和时间复杂度O(nlogn)有什么关系?,performance,algorithm,big-o,divide-and-conquer,Performance,Algorithm,Big O,Divide And Conquer,在我的算法和数据结构类中,首先介绍了分治算法,即合并排序 在执行作业算法时,我想到了几个问题 使用分治范式实现的任何算法的时间复杂度是否为O(nlogn) 该方法中的递归部分是否有能力将以O(n^2)运行的算法压缩为O(nlogn) 是什么让这样的算法首先运行在O(nlogn)中 对于(3),我假设这与递归树和可能的递归数有关。有人可能会用一个简单的以O(nlogn)运行的分而治之算法来说明复杂性是如何计算的吗 干杯, Andrew不,分而治之不能保证O(nlogn)性能。这完全取决于问题在每次

在我的算法和数据结构类中,首先介绍了
分治算法
,即
合并排序

在执行作业算法时,我想到了几个问题

  • 使用分治范式实现的任何算法的时间复杂度是否为O(nlogn)

  • 该方法中的递归部分是否有能力将以O(n^2)运行的算法压缩为O(nlogn)

  • 是什么让这样的算法首先运行在O(nlogn)中

  • 对于(3),我假设这与递归树和可能的递归数有关。有人可能会用一个简单的以O(nlogn)运行的分而治之算法来说明复杂性是如何计算的吗

    干杯,
    Andrew

    不,分而治之不能保证O(nlogn)性能。这完全取决于问题在每次递归中如何简化

    在合并排序算法中,原始问题被分成两半。然后对结果执行O(n)操作。这就是O(n…)的来源

    现在,两个子操作中的每一个子操作都有自己的
    n
    ,其大小为原始操作的一半。每次你递归,你又把问题一分为二。这意味着递归的数量将是log2(n)。这就是O(…logn)的来源

    使用分治范式实现的任何算法的时间复杂度是否为O(nlogn)

    一般来说,快速排序和合并排序的时间复杂度为O(n log(n)),但并不总是这样。

    该方法中的递归部分是否有能力将运行在类似O(n^2)到O(nlogn)的算法压缩

    这不仅仅是看起来的,它还取决于其他因素,比如与每个递归调用的输入相关的操作数

    我强烈建议这样做,您可以看到为什么MergeSort是O(n log(n))

    是什么让这样的算法首先运行在O(nlogn)中

    同样,这只是一个与输入大小相关的算法消耗时间的指标,因此说一个算法的时间复杂度为O(n log(n))并没有给出算法是如何实现的任何信息,只是说当输入开始大量增加时,所用的时间不会成正比增加,而是需要更多的时间


    我想你的问题的所有答案都可能来自It,它告诉你几乎任何分治解决方案的复杂性,是的,它必须使用递归树做所有事情,通过使用参数,你会发现一些分治解决方案不会有O(nlogn)复杂性,事实上有

    就问题2而言,它并不总是可能的,事实上,有一些问题被认为不可能比O(n^2)更快地解决,这取决于问题的性质

    下面是一个运行在O(nlogn)中的算法示例,我认为它具有非常简单、清晰且具有教育意义的运行时分析。从下图可以看出:

    所以每个递归步骤,输入被分成两部分,然后征服部分取O(n),所以树的每一层都要消耗O(n),棘手的部分可能是递归层的数量(树的高度)怎么可能是logn。这或多或少是简单的。因此,在每一步中,我们将输入分成两部分,每个部分有n/2个元素,并递归地重复,直到我们有一些恒定大小的输入。因此,在第一级,我们除以n/2,再除以n/4,然后再除以n/8,直到我们得到一个恒定大小的输入,这将是树的一片叶子,最后一个递归步骤

    在第i步,我们除以n/2^i,让我们在最后一步找到i的值。我们需要n/2^i=O(1),这是在2^i=cn时实现的,对于一些常数c,我们从两边取以2为底的对数,得到i=clogn。因此,最后一个递归步骤将是clogn th步骤,因此树具有clogn高度

    因此,对于每个clogn递归(树)级别,MergeSort的总成本将为cn,这就给出了O(nlogn)复杂性

    一般来说,只要递归步骤具有O(n)复杂度,您就可以确信您的算法将具有O(nlogn)复杂度,并且您可以将问题划分为大小为n/b的b个问题,或者更一般的问题,如果部分是n的线性分数,则加起来等于n。在不同的情况下,很可能会有不同的运行时


    回到问题2,在快速排序的情况下,可能会从O(n^2)到θ(nlogn),这正是因为平均随机情况实现了一个很好的分区,尽管运行时分析比这还要复杂。

    使用分治范式实现的任何算法的时间复杂度是否为O(nlogn)?

    不,分而治之的一般公式是:

    2是每个递归调用中的操作数,是用子问题除法的递归调用,是征服的线性操作数

    是什么让这种算法首先在O(nlogn)中运行?

    对数线性时间的一个很好的例子是合并排序算法:

    该方法中的递归部分是否有能力将类似于O(n^2)的算法压缩为O(nlogn)?

    主定理用于确定分治算法的运行时间

    如果复发是以这种形式出现的

    然后

    示例

    因为2=4^
    a = 2
    b = 4
    d = 1/2