将一组对象分成一定数量的组的算法?

2024-04-22

例如,假设我有一个 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 x 13 像素的图像,并且想要 81 个 n×m 大小的子图像,我需要将其分成 4 个 2×2 子图像,即 76 个 2×2 子图像。 1 个子图像和 1 个 1×1 子图像以获得所需子图像的确切数量。换句话说,4(4)+76(2)+1=169并且4+76+1=81。

另一个例子,如果我想将相同的 13 x 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
  • 你想分成n大小的子图像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, where /是整数除法。另外,您可能想采取x * y具有最小周长的矩形,即 的最小值x + y.

对于问题中的三个例子:

  • 分裂一个12 x 12将图像分成64个子图像,你得到R = {(1,2),(2,1)},所以你有 641 x 2子图像,或 642 x 1子图像

  • 分裂一个13 x 13将图像分成81个子图像,你得到R = {(1,2),(2,1)},所以你有 641 x 2子图像,或 642 x 1子图像

  • 分裂一个13 x 13将图像分解为36个子图像,得到R = {(1,4),(2,2),(4,1)},所以你可以使用 362 x 2子图像(最小周长)

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

如果你想做点别的事,也许tiling你的原始图像,你可能想看看矩形平铺算法 http://www.codeproject.com/Tips/149445/Rectangle-Tiling-Algorithm.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将一组对象分成一定数量的组的算法? 的相关文章

  • 硬币数量有限的最小硬币找零问题

    具体来说 问题是 给定面值数组coins 每个硬币的限制数组limits 和数量amount 返回minimum需要的硬币数量 以获得amount 或者如果不可能返回 null 另外填充数组change解决方案中使用的每个硬币的数量 这是我
  • 更快的第二好 MST 算法?

    我正在为此苦苦挣扎 我们可以使用 Kruskal 算法或 Prim 算法得到 MST 对于 第二好的 MST 我可以 首先使用上述任一算法获取 MST 对于来自 MST 的最优边缘的每个 V 1 A 首先删除或标记边缘b 继续计算 MST
  • 是否有可能比 O(n log n) 更好地计算数字列表的中位数?

    我知道可以在 O n 中计算数字列表的平均值 但是中位数呢 有没有比排序 O n log n 和查找中间元素 或者如果列表中有偶数个项目则两个中间元素的平均值 更好的算法 是的 您可以在 O n 时间内 确定性地 完成此操作 http ww
  • 求分数 a/b 的小数点后第 k 位,其中 a、b、k 是非常大的整数(小于 10e18)

    我的任务是找到分数 a b 小数点后第 k 位的数字 昨天我发现了这个算法 为了获取小数点后的任何数字 我生成一个名为 rem 的变量并进行循环 for int i 1 i lt k 1 i rem a b a rem 10 cout lt
  • OT 和 CRDT 之间的区别

    有人可以简单地向我解释一下操作转换和 CRDT 之间的主要区别吗 据我了解 两者都是允许数据在分布式系统的不同节点上无冲突地收敛的算法 在哪种用例中您会使用哪种算法 据我了解 OT主要用于文本 而CRDT更通用 可以处理更高级的结构 对吧
  • 以有效的方式找到最近点

    我在 2d 平面上有一个点 例如 x0 y0 和一组 n 点 x1 y1 xn yn 我想在 a 中找到距离 x0 y0 最近的点比尝试所有要点要好得多 有什么解决办法吗 我还应该说我的观点是这样排序的 bool less point a
  • 如何读取未知数量的输入?

    我正在使用 C Primer 这本书学习 C In 第1 4 3节 给出了以下关于读取未知数量的输入的示例代码 include
  • 计算流数据的直方图 - 在线直方图计算

    我正在寻找一种算法来生成大量流数据的直方图 最大值和最小值事先未知 但标准差和平均值在特定范围内 我很欣赏你的想法 Cheers 我刚刚找到了一个解决方案 秒 从流式并行决策树算法构建在线直方图 论文的 2 2 该算法由 Hive 项目中的
  • 创建横幅交换算法来轮播广告

    我正在构建广告横幅轮播脚本基于印象整个月均匀地显示广告 每次请求显示广告时都会进行计算 所以这将是即时完成的 广告应显示为一个接一个轮流播放 而不是仅显示一个广告 1000 次展示 然后显示另一个广告 1000 次展示 大多数情况下 它应该
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的
  • 关于合并排序代码中的组合步骤的困惑

    我有一个关于数组上的合并排序如何工作的问题 我理解 划分 步骤 它将输入数组划分为 1 长度的元素 然而 当谈到 合并 部分 组合步骤 时 我感到困惑 例如 给定输入 3 5 1 8 2 除法过程将产生 5 个元素 3 5 1 8 2 我只
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 如何在从左到右、从上到下排序的二维数组中搜索数字?

    我最近收到了这个面试问题 我很好奇有什么好的解决方案 假设我有一个二维数组 其中所有 数组中的数字在增加 从左到右 从上到下的顺序 底部 搜索和搜索的最佳方式是什么 判断目标号码是否在 大批 现在 我的第一个倾向是使用二分搜索 因为我的数据
  • 树中的节点是否被视为其自己的祖先?

    我想知道计算机科学背景下对 祖先 定义的共识是什么 我问只是因为在算法简介 http en wikipedia org wiki Introduction to Algorithms 第二版 第 14 页 第259章 有算法的描述Tree
  • 比较周期性数据的快速方法

    假设我有任意类型的数据集 A B C D 并且我想将其与另一个数据集进行比较 我希望 A B C D B C D A C D A B 和 D A B C 的比较成立 但是不适用于 A C B D 或任何其他未类似排序的集合 有什么快速方法可
  • 以与版本页面上相同的方式区分两个字符串的算法是什么?

    我正在尝试按短语区分两个字符串 类似于 StackOverflow 在版本编辑页面上区分两个字符串的方式 执行此操作的算法是什么 是否有 gems 或其他标准库可以实现此目的 编辑 我见过其他比较算法 Differ http github
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • 二进制字符串到十进制字符串

    下午好 如何将字符数多于语言最大整数类型中位数的二进制字符串转换为十进制字符串 换句话说 假设你有字符串 111001101001110100100 1001001111011100100 并且您不能先将其转换为整数 那么您将如何以 10
  • 获取无平方数的列表

    获得该值的一种方法是自然数 1 n 我们对每个因子进行因式分解 看看它们是否有重复的质因数 但这对于大的情况来说会花费很多时间n 那么有没有更好的方法从 1 中获取无平方数n 您可以使用埃拉托斯特尼筛法的修改版本 取一个布尔数组 1 n 预

随机推荐