如何在给定元素数量的情况下最大化网格尺寸

时间:2013-06-03 23:36:21

标签: python maximize

我有n个元素作为输入,函数make_grid(n)将计算包含元素的网格的尺寸。假设n = 12,那么函数必须计算宽度为4,高度为3而不是1和12左右。同样,n = 24应返回6和4。

我尝试使用ceil(sqrt(n))来获取一个维度,但根本不是一般情况,并且使用案例(n even,sqrt(n) == ceil(sqrt(n)))无效。

编辑: Finding the optimum column and row size for a table with n elements and a given range for its proportion 我已经看到了这个问题,但编码引发了我n = 24维5和5。 有什么帮助吗?

3 个答案:

答案 0 :(得分:1)

您正在寻找均匀划分n的数字,因此您需要计算n的因子,并选择最接近sqrt(n)的两个因子。一个将是小于或等于sqrt(n)的最大因子(称为f),另一个将是n/f

然而,对于许多数字,你会看到奇怪的网格,比如74,或任何素数。

答案 1 :(得分:1)

您正在寻找整数分解算法。

点击此处:Efficiently finding all divisors of a number

在这里:http://en.wikipedia.org/wiki/Integer_factorization#Factoring_algorithms

然后选择一对最符合您目标的因素。

答案 2 :(得分:0)

方法如下:

取整数n作为函数的输入。目标是获得“最平常”的表格。正如@John建议的那样,我们必须计算sqrt(n)才能了解维度。另一方面,我们必须计算n的所有除数,以便选择最接近sqrt(n)的除数。

我们如何选择最接近的低值?我们可以使用这个技巧(Python):finding index of an item closest to the value in a list that's not entirely sorted并获得除数列表中最近值的索引,假设为hIndex。 然后可以计算另一个维度,将n除以divisors[hIndex]或使用新索引wIndex = hIndex + 1,然后获取divisors[wIndex]

Python代码是这样的(注意我使用al lazy evaluation来查找除数):

import numbers
from math import sqrt

def get_dimensions(n):
    tempSqrt = sqrt(n)
    divisors = []
    currentDiv = 1
    for currentDiv in range(n):
        if n % float(currentDiv + 1) == 0:
         divisors.append(currentDiv+1)
    #print divisors this is to ensure that we're choosing well
    hIndex = min(range(len(divisors)), key=lambda i: abs(divisors[i]-sqrt(n)))
    wIndex = hIndex + 1

   return divisors[hIndex], divisors[wIndex]