Algorithm 将一组对象拆分为若干组的算法?

Algorithm 将一组对象拆分为若干组的算法?,algorithm,split,grouping,Algorithm,Split,Grouping,例如,假设我有一个2D像素阵列(换句话说,一幅图像),我想将它们排列成若干组,这样组的数量就可以完美地相加到某个数字(例如,另一个2D像素阵列中的总项目)。目前,我尝试的是使用比率和像素的组合,但除了完美整数比率(1:2、1:3、1:4等)之外,其他任何方法都失败了。当它确实失败时,它只是将其缩放到小于它的整数,因此,例如,1:2.93比例缩放将使用1:2缩放,并将部分图像截断。我不想这样做,那么我可以使用哪些算法来避免矩阵多重化呢?我记得看到了一些类似于我第一次提到的东西,但我找不到。这是一个

例如,假设我有一个2D像素阵列(换句话说,一幅图像),我想将它们排列成若干组,这样组的数量就可以完美地相加到某个数字(例如,另一个2D像素阵列中的总项目)。目前,我尝试的是使用比率和像素的组合,但除了完美整数比率(1:2、1:3、1:4等)之外,其他任何方法都失败了。当它确实失败时,它只是将其缩放到小于它的整数,因此,例如,1:2.93比例缩放将使用1:2缩放,并将部分图像截断。我不想这样做,那么我可以使用哪些算法来避免矩阵多重化呢?我记得看到了一些类似于我第一次提到的东西,但我找不到。这是一个NP型问题吗

例如,假设我有一个12×12像素的图像,我想把它分割成64个n×m大小的子图像。通过分析,人们可以看到我可以将其分解为8个2×2的子图像和56个2×1的子图像,以获得准确数量的子图像。换句话说,我将使用所有4(8)+56(2)=144个像素得到8+56=64个子图像

类似地,如果我有一个13×13像素的图像,并且我想要81个n×m大小的子图像,我需要将其分解为4个2×2子图像、76个2×1子图像和1个1×1子图像,以获得所需子图像的确切数量。换句话说,4(4)+76(2)+1=169和4+76+1=81

还有一个例子,如果我想将相同的13×13图像分割成36个n×m大小的子图像,我需要14个4×2子图像、7个2×2子图像、14个2×1子图像和1个1×1子图像。换句话说,8(13)+4(10)+2(12)+1=169和13+10+12+1=36


当然,图像不需要是正方形,也不需要子图像的数量,但两者都不应该是素数。此外,子图像的数量应小于图像中的像素数。我可能想坚持子图像的宽度和高度的二次幂,以便于将一个较大的子图像转换为多个子图像,但如果我能找到一个不这样做的算法,那就更好了。这基本上就是我试图找到的算法。

我知道你想要将给定大小的矩形图像分割成
n
矩形子图像。假设你有:

  • 大小
    w*h
  • 并且您想要分割成大小为
    x*y
我想你想要的是

R = { (x, y) | x in [1..w], y in [1..h], x * y == (w * h) / n }
这是成对的集合
(x,y)
,使得
x*y
等于
(w*h)/n
,其中
/
是整数除法。此外,您可能希望采用周长最小的
x*y
矩形,即
x+y
的最小值

关于问题中的三个例子:

  • 12x12
    图像拆分为64个子图像,得到
    R={(1,2)、(2,1)}
    ,这样就得到了64个
    1x2
    子图像或64个
    2x1
    子图像

  • 将一个
    13x13
    图像拆分为81个子图像,您将得到
    R={(1,2)、(2,1)}
    ,因此您有64个
    1x2
    子图像或64个
    2x1
    子图像

  • 将一个
    13x13
    图像拆分为36个子图像,您可以使用
    R={(1,4)、(2,2)、(4,1)}
    ,因此可以使用36个子图像(最小周长)

对于每个示例,您当然可以组合不同大小的矩形


如果你想做些别的事情,比如平铺你的原始图像,你可能想看看

如果你不在乎子图像的大小不同,一个简单的方法就是重复地将子图像一分为二。每一次新的分割都会增加一个子图像的数量。

我不知道我是否理解你的问题。假设你有一个10x10像素的图像,你想把它分成9个子图像。由于像素是离散的实体,我看到的唯一解决方案是生成9个大小为3x3的子图像,这显然将原始图像的一部分切掉。实际上,这就是我要做的。当然,这会使事情变得稍微困难一些,但我可能会比其他任何人有更多的1像素组。这不会创建相同大小的所有子图像吗?如果是这样,那就不是我想要的了,因为我知道某些组的大小必须不同,才能总计到我需要的特定数量的组。@Smartboy:是的,我的解决方案提供了大小相同的子图像
(x,y)
。恐怕我不理解您对不同大小的组的额外限制。你可以编辑你的问题,并用一个例子来澄清它吗?@MarcoS我编辑了它,希望用几个例子来澄清我想做的事情。这有用吗?