给定一个整数面积 A,如何找到一个矩形的整数边 w 和 h,使得 w*h = A 并且 w+h 尽可能小?我宁愿算法简单而不是高效(尽管在合理的效率范围内)。
实现这一目标的最佳方法是什么?
找出 A 的主要因素,然后以某种方式将它们组合起来以平衡 w 和 h?找到面积最接近 A 的整数边的两个正方形,然后以某种方式在它们之间进行插值?还有其他我没有想到的方法吗?
你只需要找到:
两者的乘积总是 A,所以这些因素是你的w
和h
当然你只需要搜索其中一个,因为一旦你w
设置好了h = A / w
这是我头顶上的东西,
从...开始w=1; h=A;
然后迭代w
,增加它。每次增加后,w
尽量减少h
。w*h>A
此外,您将需要某种确定 aw/h 组合大小的启发式函数。让我们称之为size(x,y)
。
在每个步骤中,您都必须检查 if size(w,h)<size(bestW,bestH)
、 wherebestW
和是迄今为止您遇到的bestH
最佳值。w
h
就实施size(x,y)
而言,您可以return x+y
或return Math.abs(x-y)
因为你只需要不断增加w
,直到w
>=h
并且最初h=A
我猜想复杂性在某个地方O(A/2) <= true complexity <= O(2A)
现在来一些伪代码:
w=1;
h=A;
bestW=w;
bestH=h;
while(2*w<=A){
w++;
while(w*h>A) {
h--;
}
if(w*h==A && size(w,h)<size(bestW,bestH)){
bestW=w;
bestH=h;
}
}