Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 设计优化算法,以找到';a';和';b';_Algorithm_Optimization_Numbers - Fatal编程技术网

Algorithm 设计优化算法,以找到';a';和';b';

Algorithm 设计优化算法,以找到';a';和';b';,algorithm,optimization,numbers,Algorithm,Optimization,Numbers,假设给我们一个复合数(n>3),可以写成:n=a*b,其中a和b是任意整数 现在,我们的任务是计算a和b的值,以便函数f(a,b)=a-b最小化。 我实施了以下方法: intn; cin>>n;//从用户那里获取它 /*现在,求a和b的值*/ INTA=1; int b=n; 内部温度; 内部温度; 对于(temp_a=1;temp_a考虑不从1迭代到sqrt(n),而是从sqrt(n)迭代到1。首先找到的除数给出了答案,您无需进一步进行您希望找到n的最大除数不大于sqrt(n)。最简单的方法

假设给我们一个复合数(n>3),可以写成:
n=a*b
,其中a和b是任意整数

现在,我们的任务是计算ab的值,以便函数
f(a,b)=a-b
最小化。

我实施了以下方法:

intn;
cin>>n;//从用户那里获取它
/*现在,求a和b的值*/
INTA=1;
int b=n;
内部温度;
内部温度;

对于(temp_a=1;temp_a考虑不从1迭代到sqrt(n),而是从sqrt(n)迭代到1。首先找到的除数给出了答案,您无需进一步进行

您希望找到n的最大除数不大于sqrt(n)。最简单的方法是迭代所有可能的除数并检查它们。这需要O(sqrt(n))最坏的情况是时间

不幸的是,在最坏的情况下,在O(logn)时间内无法解决此问题。事实上,即使在O((logn)^p)时间内也无法解决此问题任何p的时间。很容易证明,如果可能的话,那么你可以在多项式时间内找到任何一个以字节为单位的数字。现在没有人能做到这一点,而且有一种广泛使用的方法,它强烈依赖于没有人能如此快地分解数字。这是每个人都如此害怕的原因之一=)

然而,有一些算法的渐近速度比O(sqrt(N))快。此外,还有一些更快的因式分解启发式算法。我强烈建议阅读有关这件事的报告


稍微提高复杂性的方法之一是预计算所有素数,直到sqrt(N)。如果你试着只除以N,你就能找到N的素因子分解。知道素因子分解,你可以通过递归搜索有效地迭代所有可能的因子。查找因式分解所需的时间与检查素数的时间相同,即O(sqrt(N)/log(N))。迭代所有除数所需的时间与这些除数的数量成正比,即N。

我花了很多时间来找到这个问题的最佳解决方案,但失败了。然后我试着测试@psyco的方法是更好还是@Nyavro的方法更好。我个人认为从
sqrt(n)倒计时到1
一定更好,但为了检查@psyco的参数,我在一个python程序中实现了这两种方法,并绘制了一个图表来比较两种方法可能需要的迭代次数以找到解决方案。该图适用于4到10000之间的所有组合数。下面是我的Python实现:

导入matplotlib.pyplot作为plt
输入数学
X=10001
n1=[0]*X
n2=[]
对于范围(2,int(math.sqrt(X))+1)内的i:
如果n1[i]==0:
对于范围内的j(i*i,X,i):
n1[j]=1
对于范围(4,X)内的i:
如果n1[i]==1:
n2.附加(i)
#打印n2
计数=[]
count2=[]
对于n2中的n:
a=1
b=n
c=0
标志=0
对于范围内的ta(int(math.sqrt(n)),0,-1):
c+=1
如果n%ta==0:
tb=n/ta
标志=1

如果是,那就太好了。但是,这不是最佳方案。我可以给你一个测试用例,在这个测试用例中,你和我的方法将需要相同的时间来执行greed。但不幸的是,我无法想象找到除数的更好方法。考虑到
3125
作为一个测试用例,您的方法大约需要30个步骤,而我的方法大约需要25个步骤。您是对的。我知道,可以按相反的顺序做。但是,关键案例尚未涵盖。它们仍然需要相同的时间。这就是为什么我问是否有可能设计一个算法来降低复杂性,而不是优化它。