【发布时间】:2012-04-15 03:38:42
【问题描述】:
对于 google codeJam 资格赛,问题之一是找出两个给定整数之间有多少“回收对”。
这是我的解决方案,但对于大型数据输入集来说速度不够快。给定 @a = 10, @b = 200000 之类的东西,它开始变慢。
我认为我的解决方案是 O(2^n)(我还没有对大 O 分析有扎实的了解),这太可怕了。我想知道是否有一种标准方法可以使用更快的算法迭代这样的两个循环?
def getPairs
(@a..@b).each do |n|
(n..@b).each do |m|
if (containsSame(n,m)) && (isMatch(@a, n, m, @b))
@recycledPairs += 1
end
end
end
end
编辑: 来自Google CodeJam site:
假设一对不同的正整数 (n, m) 被回收,如果您可以通过将一些数字从 n 的后面移动到前面而不改变它们的顺序来获得 m。例如,(12345, 34512) 是一个循环对,因为您可以通过将 345 从 12345 的末端移到前面来获得 34512。请注意,n 和 m 必须具有相同的位数才能成为循环对。 n 和 m 都不能有前导零。
【问题讨论】:
-
循环和嵌套循环是实现工件,而不是算法。
-
来自 google codeJam 网站:假设一对不同的正整数 (n, m) 被回收,如果您可以通过将一些数字从 n 的后面移动到前面而不改变它们的顺序来获得 m。例如,(12345, 34512) 是一个循环对,因为您可以通过将 345 从 12345 的末端移到前面来获得 34512。请注意,n 和 m 必须具有相同的位数才能成为循环对。 n 和 m 都不能有前导零。
-
@JRL:有一种算法叫Nested loop,用在RDBMS中。
-
@AFrase:也许这个MSDN article,关于 SQL-Server 中使用的 3 种不同算法(嵌套循环、哈希连接、合并连接)是有帮助的。它们的表现完全不同,具体取决于数据的大小。还有这篇文章:Nested loops, Hash join and Sort Merge joins – difference?