【问题标题】:How to iterate through a Matrix without 2 for-loops如何在没有 2 个 for 循环的情况下遍历矩阵
【发布时间】:2019-05-25 11:46:14
【问题描述】:

我有一个练习,需要通过矩阵“m”的元素进行迭代,困难在于运行时间应该是线性的,这意味着如果我使用 forloops,则只允许一个。

我现在的问题是,我总是发现自己想要使用 2 个 forloop,但运行时间不是线性的,而是二次的。我正在考虑只遍历 m[i] 然后检查这些是否只是 Int 0,但这将是 2 个 forloops 或者看看我是否可以加入元素。可悲的是,我已经找不到任何有用的东西了。我也考虑过使用 'x in list' 参数,但这也无济于事。

提前致谢。

m = [[0,0,0],
     [1,0,1],
     [1,0,0]]


#for i in m
#check all elements in m[i] for Ints '0'    

#m[0] --> All Elements are the Integer 0
#--> Output: True.
#The output should be a Boolean 'True', when the elements of one m[i] are all Integers 0.

【问题讨论】:

    标签: python arrays for-loop matrix


    【解决方案1】:

    我会记住,运行时分析是基于输入的大小。也就是说,如果您的输入由 n 个元素组成,并且您只对每个元素进行一次迭代,那么这就是O(n)。如果您的矩阵大小为n x m,那么我相信线性度将定义为O(n x m),即与输入大小成线性关系。

    此外,嵌套 for 循环的存在并不一定意味着程序的运行时是二次方的,尽管这是考虑运行时的有用方式。

    编辑:这不会改变理论运行时间,但您可以查看矢量化内置函数(如 python 中的sum)来完全处理每一行。正如我所说,这不会改变算法运行时间,但引擎盖下的优化和矢量化可以比对每个矩阵元素的简单迭代提高速度。

    作为对“两个 for 循环总是意味着 O(n^2)”的阐述:这仅在以下情况下才是正确的:

    # n elements in the input
    for i in range(n):
        for j in range(n):
            # do things
    
    # another possibility
    # n elements in the input
    for i in range(n):
        for j in range(i):
            # worst case, i == j, bringing this to O(n^2)
            # do things
    
    

    【讨论】:

    • 感谢您的回答!我其实也有同样的想法,但是我的导师说我们不应该使用嵌套的 forloop。我们有一个类似的伪代码练习,我们应该在其中分析嵌套 forloop 的运行时。他说我们应该只迭代一次,这意味着O(n)作为我们的运行时,两个forloops总是意味着O(n^2)。他对此有些挑剔。该矩阵是一个n x n 邻接矩阵,其中不允许自循环。
    • 嗯,他对“两个 for 循环总是意味着 O(n^2)”的说法是不正确的。输入大小如果在某种程度上也是一个透视问题(即,如果你说“我的输入只是行长度”,那么可以肯定的是,迭代整个矩阵在“输入大小”中是二次的,在这种情况下是行尺寸)。我将在上面编辑我的答案以添加另一种可能性。
    • 哇,感谢您提供 sum() 函数的提示!我可以遍历 m[i] 然后检查是否有一个 sum(m[i]) == 0。
    • 是的,没错!正如我之前提到的(这就是我的导师的陈述不正确的意思),这不会降低算法的复杂性,因为 sum 函数本身必须遍历行中的每个元素。然而,由于矢量化和其他底层优化,它确实导致了 Python 的实际加速!如果对您有帮助,请随意选择答案;)
    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2018-09-30
    相关资源
    最近更新 更多