Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 比嵌套循环更快的算法?_Algorithm_Loops_Big O - Fatal编程技术网

Algorithm 比嵌套循环更快的算法?

Algorithm 比嵌套循环更快的算法?,algorithm,loops,big-o,Algorithm,Loops,Big O,对于GoogleCodejam资格认证,其中一个问题是找出两个给定整数之间有多少“循环对” 这是我的解决方案,但对于大型数据输入集来说速度不够快。给定@a=10、@b=200000这样的值,它开始变慢 我认为我的解决方案是O(2^n)(我还没有对大O分析有很好的理解),这很可怕。我想知道是否有一种标准的方法可以用更快的算法迭代两个这样的循环 def getPairs (@a..@b).每个都有| (n..@b).每个都是| if(containsSame(n,m))&&(isMatch(@a,n

对于GoogleCodejam资格认证,其中一个问题是找出两个给定整数之间有多少“循环对”

这是我的解决方案,但对于大型数据输入集来说速度不够快。给定@a=10、@b=200000这样的值,它开始变慢

我认为我的解决方案是O(2^n)(我还没有对大O分析有很好的理解),这很可怕。我想知道是否有一种标准的方法可以用更快的算法迭代两个这样的循环

def getPairs
(@a..@b).每个都有|
(n..@b).每个都是|
if(containsSame(n,m))&&(isMatch(@a,n,m,@b))
@循环使用对+=1
终止
终止
终止
终止
编辑: 发件人:

假设一对不同的正整数(n,m)是循环的,如果你可以通过将一些数字从n的后面移到前面而不改变它们的顺序来获得m。例如,(1234534512)是一个循环对,因为您可以通过将345从12345的末端向前移动来获得34512。请注意,n和m必须具有相同的位数才能成为一对循环使用的数字。n和m都不能有前导零

描述中说“注意,n和m必须具有相同的位数才能成为一对可循环使用的数字。”

您的内部循环没有考虑到这一点。如果@a=2和@b=20000,则可以剪切掉整个内部循环。如果
n
是两位数,则只需测试
m
的两位数值。仔细查看内部循环的上限。

描述中说“注意,n和m必须具有相同的位数才能成为循环对。”


您的内部循环没有考虑到这一点。如果@a=2和@b=20000,则可以剪切掉整个内部循环。如果
n
是两位数,则只需测试
m
的两位数值。仔细查看内部循环的上限。

来自语句:max b最多为2*10^6。与所有代码阻塞问题一样,您有多个测试

第一步:预信用证。对于每个数字n=[1..maxb],保存所有严格小于它的循环数字(每个数字不超过7个),例如

步骤2:针对每个测试。从A到B遍历每个数字,并计算A和B之间的“循环”数


时间复杂度:步骤1对每个数字都适用(位数),即O(ln)。你必须做b次。总之O(b*lnb)。步骤2也是如此。这在大型测试用例上的工作时间不到一秒钟。

从语句中可以看出:max b最多为2*10^6。与所有代码阻塞问题一样,您有多个测试

第一步:预信用证。对于每个数字n=[1..maxb],保存所有严格小于它的循环数字(每个数字不超过7个),例如

步骤2:针对每个测试。从A到B遍历每个数字,并计算A和B之间的“循环”数

时间复杂度:步骤1对每个数字都适用(位数),即O(ln)。你必须做b次。总之O(b*lnb)。步骤2也是如此。这在大型测试用例上的工作时间不到一秒钟。

您可以阅读正确的解决方案

基本上,解决方案是计算大于
n
,但不大于
B
的所有不同旋转,对于每个
n

,您可以读取正确的解决方案


基本上,解决方案是为每个
n
循环和嵌套循环计算大于
n
,但不大于
B
的所有不同旋转,它们是实现工件,而不是算法如果您可以通过将一些数字从n的后面移到前面而不改变其顺序来获得m,则循环使用。例如,(1234534512)是一个循环对,因为您可以通过将345从12345的末端向前移动来获得34512。请注意,n和m必须具有相同的位数才能成为一对循环使用的数字。n和m都不能有前导零。@JRL:有一个名为的算法,在RDBMS中使用。@AFrase:关于SQL Server中使用的3种不同算法(嵌套循环、散列联接、合并联接),可能会有所帮助。根据数据的大小,它们的执行方式完全不同。本文还介绍:循环和嵌套循环是实现工件,而不是算法。来自google codeJam站点:假设一对不同的正整数(n,m)可以循环使用,如果您可以通过将一些数字从n的后面移到前面而不改变其顺序来获得m。例如,(1234534512)是一个循环对,因为您可以通过将345从12345的末端向前移动来获得34512。请注意,n和m必须具有相同的位数才能成为一对循环使用的数字。n和m都不能有前导零。@JRL:有一个名为的算法,在RDBMS中使用。@AFrase:关于SQL Server中使用的3种不同算法(嵌套循环、散列联接、合并联接),可能会有所帮助。根据数据的大小,它们的执行方式完全不同。还有这篇文章:实际问题陈述还说A和B也必须有相同的位数,所以这没有帮助。实际问题陈述还说A和B也必须有相同的位数,所以这没有帮助。
10 - 1
321 - 132, 213