【问题标题】:How to evaluate nested boolean values?如何评估嵌套的布尔值?
【发布时间】:2019-07-22 14:01:23
【问题描述】:

我对 python 比较陌生,并且已经熟悉了基础知识,甚至嵌套了 for 循环。我遇到了下面的函数,当我试图理解它在做什么时,我被绊倒了。它总是返回通过函数传递的列表,并且似乎根据传入的列表的长度将布尔值 False 分配给元素“x”,最终在 false 的值不是时中断循环案子。我不明白的是 for 循环中第一个元素的作用,相对于第二个 for 循环(它从大小中减去)。如果有任何可以帮助我更好地理解这个函数在做什么,将不胜感激。

def myfunc(list):

    size = len(list)

    for x in range(0, size):
        foo = False

        for x2 in range(0, size - x - 1):
            if list[x2] > list[x2 + 1]:
                list[x2], list[x2 + 1] = list[x2 + 1], list[x2]
                foo = True

        if not foo: break

    return list

【问题讨论】:

  • 顺便说一句,不要将您的列表命名为list。为什么?因为它会影响内置。
  • 这是一个排序例程。 foo 只跟踪您是否交换了任何元素。一旦您浏览列表而无需进行任何交换,您就知道它已排序。

标签: python for-loop boolean


【解决方案1】:

您编写的函数是一种称为冒泡排序的排序技术的实现。它只是比较相邻元素以对列表进行排序。

虽然您不必在 size - x - 1 迭代时停止第二个 for 循环,但它有助于减少您执行的比较次数,从而提高已经具有 n 级时间复杂度的算法的效率 ^ 2 在较大的列表中表现不佳。

如果您跟踪执行,您会发现在外循环的每次迭代之后,都会有一个元素到达它在排序数组中的确切位置,并且最好不要在后续迭代中考虑该元素。

因此,您的程序会提前停止内部循环,因为知道最后的 x 元素已经排序。

当涉及到布尔值时,它会进一步减少您执行的比较。 例如,当您传入一个排序列表时: 在外循环的第一次迭代中,x = 0。然后内部循环迭代size - 1 次比较相邻元素但不执行交换,因为元素已经按顺序排列。 一旦内部循环完成了外部循环的第一次迭代(x = 0)的所有迭代,继续进行进一步的迭代是没有意义的,最好在此时停止算法。 break 语句确保发生这种情况。

因此,在最好的情况下,您的算法的时间复杂度将是 n 阶 (O(n)),这比 O(n^2) 的平均或最坏情况复杂度要好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2012-06-04
    • 1970-01-01
    • 2011-07-31
    • 2012-11-22
    相关资源
    最近更新 更多