Algorithm 将一组对象拆分为若干组的算法?
例如,假设我有一个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=36Algorithm 将一组对象拆分为若干组的算法?,algorithm,split,grouping,Algorithm,Split,Grouping,例如,假设我有一个2D像素阵列(换句话说,一幅图像),我想将它们排列成若干组,这样组的数量就可以完美地相加到某个数字(例如,另一个2D像素阵列中的总项目)。目前,我尝试的是使用比率和像素的组合,但除了完美整数比率(1:2、1:3、1:4等)之外,其他任何方法都失败了。当它确实失败时,它只是将其缩放到小于它的整数,因此,例如,1:2.93比例缩放将使用1:2缩放,并将部分图像截断。我不想这样做,那么我可以使用哪些算法来避免矩阵多重化呢?我记得看到了一些类似于我第一次提到的东西,但我找不到。这是一个
当然,图像不需要是正方形,也不需要子图像的数量,但两者都不应该是素数。此外,子图像的数量应小于图像中的像素数。我可能想坚持子图像的宽度和高度的二次幂,以便于将一个较大的子图像转换为多个子图像,但如果我能找到一个不这样做的算法,那就更好了。这基本上就是我试图找到的算法。我知道你想要将给定大小的矩形图像分割成
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
的最小值
关于问题中的三个例子:
- 将
图像拆分为64个子图像,得到12x12
,这样就得到了64个R={(1,2)、(2,1)}
子图像或64个1x2
子图像2x1
- 将一个
图像拆分为81个子图像,您将得到13x13
,因此您有64个R={(1,2)、(2,1)}
子图像或64个1x2
子图像2x1
- 将一个
图像拆分为36个子图像,您可以使用13x13
,因此可以使用36个子图像(最小周长)R={(1,4)、(2,2)、(4,1)}
如果你想做些别的事情,比如平铺你的原始图像,你可能想看看如果你不在乎子图像的大小不同,一个简单的方法就是重复地将子图像一分为二。每一次新的分割都会增加一个子图像的数量。我不知道我是否理解你的问题。假设你有一个10x10像素的图像,你想把它分成9个子图像。由于像素是离散的实体,我看到的唯一解决方案是生成9个大小为3x3的子图像,这显然将原始图像的一部分切掉。实际上,这就是我要做的。当然,这会使事情变得稍微困难一些,但我可能会比其他任何人有更多的1像素组。这不会创建相同大小的所有子图像吗?如果是这样,那就不是我想要的了,因为我知道某些组的大小必须不同,才能总计到我需要的特定数量的组。@Smartboy:是的,我的解决方案提供了大小相同的子图像
(x,y)
。恐怕我不理解您对不同大小的组的额外限制。你可以编辑你的问题,并用一个例子来澄清它吗?@MarcoS我编辑了它,希望用几个例子来澄清我想做的事情。这有用吗?