是带有嵌套的for循环O(n)或O(n ^ 2)的while循环吗?

时间:2020-07-16 01:57:34

标签: algorithm for-loop while-loop big-o complexity-theory

我有2个代码块。一个带有一个while循环,第二个带有while循环内的for循环。我的教授告诉我,选项1的算法复杂度为O(n),选项2的算法复杂度为O(n ^ 2),但是除了指向嵌套的for循环之外,无法解释为什么会这样。我很困惑,因为对于给定的大小N,两者都执行完全相同的计算次数,这似乎并不表示它们具有不同的算法复杂性。

我想知道:

a)如果我的教授是正确的,以及他们如何拥有相同的计算结果却有不同的大目标。

b)如果我的教授不正确并且复杂度相同,是O(n)还是O(n ^ 2)?为什么?


我使用了以“#”表示的内联注释来注释计算。要交付的软件包应为N。Self.trucks是一个列表。 self.isWorkDayComplete是一个布尔值,由是否已交付所有软件包确定。

选项1:

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/">
    <xsl:apply-templates select="*" />
</xsl:template>


<xsl:template match="@*|*">
    <xsl:copy>
        <xsl:apply-templates select="@*|*[name()!='Value' or position()=last()]"/>
        <xsl:value-of select="text()" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

选项2:

# initializes index for fake for loop
truck_index = 0   
while(not self.workDayCompleted):
    # checks if truck index has reached end of self.trucks list
    if(truck_index != len(self.trucks)): 
        # does X amount of calculations required for delivery of truck's packages
        while(not self.trucks[truck_index].isEmpty()):
            trucks[truck_index].travel()
            trucks[truck_index].deliverPackage() 
        if(hub.packagesExist()):
            truck[truck_index].travelToHub()
            truck[truck_index].loadPackages()
        # increments index
        truck_index += 1 
    else:
        # resets index to 0 for next iteration set through truck list
        truck_index = 0 
        # does X amount of calculations required for while loop condition
        self.workDayCompleted = isWorkDayCompleted() 

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

a)如果我的教授是正确的,以及他们如何拥有相同的计算结果却有不同的大目标。

两种执行相同数量“基本操作”的算法具有相同的时间复杂度,而不管代码的结构如何。

b)如果我的教授不正确并且复杂度相同,是O(n)还是O(n ^ 2)?为什么?

首先,您必须定义:什么是“ n”?卡车的数量是多少?接下来,每辆卡车的“基本操作”次数是否相同或有所不同?

例如:如果每辆卡车的操作次数为常数C,则操作总数为C * n。那就是复杂度类O(n)。

答案 1 :(得分:2)

这两个代码肯定似乎有效地实现了相同的算法(即,每辆卡车都交付一个包裹,然后检查工作日是否完成,重复直到工作日完成)。从这个角度来看,您是值得怀疑的。

问题变成:它们是O(n)还是O(n 2 )?正如您所描述的,这是无法确定的,因为我们不知道完成工作日的条件是什么。它与卡车完成的工作量有关吗?没有这些信息,我们将无法推理何时外循环退出。就我们所知,条件是每辆卡车必须交付2 n 个包裹,复杂度实际上为O(n 2 n )。

因此,如果您的教授是对的,我唯一的猜测是两个选项之间isWorkDayCompleted()的实现之间存在差异。但是,除非这样,这两个选项应该具有相同的复杂性。

无论如何,当涉及到这样的问题时,确保你们都在谈论相同的事情总是很重要的:

  1. n的含义(大概是卡车数量)
  2. 您要计算的数量(大概是交货数量,也可能是工作日的检查)
  3. 结束状态是什么(对我来说是个危险信号-需要更好地定义工作日)

随后的编辑使我相信这两个选项均为O(n),因为它们最终会根据卡车的数量及其容量最终对每个包裹执行一次或两次“旅行”操作。鉴于此,我认为您的核心问题(那些不同的控制结构导致不同的复杂性分析)的答案是否定的。

内部也不太可能以某种重要方式影响代码复杂性,因此我的建议是与您的教授聚在一起,看看他们是否可以扩大自己的想法。很有可能这是他们的疏忽,或者是他们试图对您正在使用的某些组件的实施方式提出更微妙的观点。

如果您得到了他们的解释,并且遇到了更复杂的问题,但您仍然难以理解,那可能应该是一个单独的问题(也许与此问题相关联)。