寻找具有给定体积的所有尺寸的长方体

时间:2017-11-11 22:28:15

标签: algorithm

我有一个整数的间隔,我需要找到所有独特的长方体,其体积在所述间隔内。

我想出一个循环遍历所有3个数字(长方体的大小)(1x1x1,1x1x2,......;也就是2x1x1被认为与1x1x2相同)的所有uniqe组合,从1到上限范围间隔,然后检查计算的卷是否在该间隔内。如果上限不是太大,此解决方案可以完美地工作。但如果间隔以数千结束,则解决方案变得非常缓慢。

我对代码并不感兴趣,因为我在如何以不同方式解决这个问题的算法中。你会怎么解决这个问题?

3 个答案:

答案 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;
&#13;
&#13;

答案 1 :(得分:0)

定义目标间隔I = [A ... B],给出M = B-A + 1个不同的整数体积。

你必须孤立地考虑每一个。

对于任何这些目标体积v,一个天真的算法(可能仍然比你的更好)将是:

  1. 找到那个的素数因子分解;让它产生Ω(n)因子;将它们存储为清单A.
  2. {v,1,1}是可能的元组。
  3. for i in 1 ...Ω(n):
    3.1。 r = prod(对于l = 1到i,A_l)
    3.2 {r,v / r,1}是可能的元组
    3.3 for i in i + 1 ...Ω(n):
    3.3.1 s = prod(A_m表示m = i + 1到k) 3.3.2 {r,s,v / r / s}是可能的元组
  4. 这个算法是天真的,因为它假设找到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