我有一个整数的间隔,我需要找到所有独特的长方体,其体积在所述间隔内。
我想出一个循环遍历所有3个数字(长方体的大小)(1x1x1,1x1x2,......;也就是2x1x1被认为与1x1x2相同)的所有uniqe组合,从1到上限范围间隔,然后检查计算的卷是否在该间隔内。如果上限不是太大,此解决方案可以完美地工作。但如果间隔以数千结束,则解决方案变得非常缓慢。
我对代码并不感兴趣,因为我在如何以不同方式解决这个问题的算法中。你会怎么解决这个问题?
答案 0 :(得分:1)
如果您的代码很慢,它可能会尝试可以立即丢弃的值范围,或者它过于复杂并且在循环条件等中计算平方根或立方根。尝试一些简单的方法,如下面的代码示例,我确保a≤b≤c以避免重复:
if (Math.cbrt == undefined) // cubic root fix for older browsers
Math.cbrt = function(x) {var n = 1; while (n * n * n <= x) ++n; return n - 1;}
function cuboids(min_volume, max_volume) {
var results = [];
var cr = Math.cbrt(max_volume);
for (var a = 1; a <= cr; a++) {
var sr = Math.sqrt(max_volume / a);
for (var b = a; b <= sr; b++) {
var lower = Math.ceil(min_volume / (a * b));
var upper = Math.floor(max_volume / (a * b));
for (var c = Math.max(b, lower); c <= upper; c++) {
results.push([a, b, c]);
}
}
}
return results;
}
var results = cuboids(99900, 100000);
for (var i in results) document.write(results[i].join("*") + "<br>");
&#13;
答案 1 :(得分:0)
定义目标间隔I = [A ... B],给出M = B-A + 1个不同的整数体积。
你必须孤立地考虑每一个。
对于任何这些目标体积v,一个天真的算法(可能仍然比你的更好)将是:
这个算法是天真的,因为它假设找到A很容易。实际上,在创建A时,您最好记下所有元组。
答案 2 :(得分:0)
我可能会在前两个维度上循环对,然后直接计算第三个维度的最小值和最大值以获得区间,并根据前两个维度的乘积保存早期的解决方案。类似的东西:
volume_interval = (Vmin, Vmax)
solution_intervals = {}
for w = 1 to n do
for d = w to n do
// see whether we've already encountered this case before
if solution_intervals[w*d] is not defined then
// compute min and max height to get in volume interval
min = ceiling(volume_interval.Vmin / (w*d))
max = floor(volume_interval.Vmax / (w*d))
solution_intervals[w*d] = (min, max)
// look up precomputed solution
soln = solution_intervals[w*d]
// print out every possible set of dimensions
for i = soln.min to soln.max do
print w, d, h