【问题标题】:Double counting loop (n*n code performance)双计数循环(n*n 代码性能)
【发布时间】:2019-11-21 06:02:32
【问题描述】:

在 Python 中,我有一个像这样的表格,以列表的形式出现

A: 8
B: 6
C: 8
D: 3
E: 4
F: 5
G: 7

我试图为每一行获取“邻居”的数量,例如数字为相同数字、-1 或 +1 的行数。应该是这样的:

A: 3: 8
B: 3: 6
C: 3: 8
D: 2: 3
E: 3: 5
F: 3: 5
G: 4: 7

我有一个有效的代码,由一个双循环组成:对于每一行,循环遍历所有行并计算所有符合要求的行

这可行,但是对于数千行,我最终会遇到 n*n 性能问题。有什么通用的方法来改进这个吗?

【问题讨论】:

  • 我不会发布答案,因为您没有显示自己的代码(需要作为起点),但您可以使用 collections.Counter 在(摊销的)O(1) 中执行邻居搜索,以Ω(n) 内存使用为代价。
  • 另外,你有两次 8,但邻居数不同,这似乎不太可能。
  • 我会首先计算列中的所有数字并创建字典。接下来,我将使用这本字典创建一个新的字典,其中包含每个数字的邻居数。最后我会使用这本字典来创建新列表

标签: python python-3.x algorithm performance


【解决方案1】:

因此,带有“8”的行所具有的邻居数是以下各项之和:

  • 7 的个数
  • 8 的个数
  • 9 的个数

简单的解决办法是:

创建一个按计数索引的字典,其值为具有该计数的行数。

检查你的桌子。对于每一行,将相应的字典计数值加一。因此,当您看到“A”行时,将键 8 的计数加 1。当您看到“B”行时,将键 6 的计数加 1,依此类推。完成后,计数对于键 8 将是 2。键 6 将具有计数 1,等等。

再次检查您的桌子。对于每个项目,输出键、其计数以及三个字典值的总和:dictionary[count] + dictionary[count-1] + dictionary[count+1]

算法是 O(n),有 O(n) 额外空间(用于字典)。

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多