算法帮助:如何将数组划分为N个段,且最大段最少(平衡分段)

2023-11-23

我在一个俄语编程论坛上遇到了这个问题,但还没有想出一个优雅的解决方案。

Problem:

你有一个数组N 个正整数,你需要把它分成M 个连续段,使得最大段的总和是最小的可能值。我所说的段总数是指其所有整数的总和。换句话说,我想要一个平衡良好的数组分段,您不希望单个分段太大。

Example:

  • 数组:[4,7,12,5,3,16]

  • M = 3,这意味着我需要将数组分为 3 个子数组。

  • 解决方案是: [4,7] [12, 5] [3, 16],这样最大的段是 [3, 16] = 19,并且没有其他分段变体可以产生具有较小总数的最大段。

另一个例子:

  • 数组 [3, 13, 5, 7, 18, 8, 20, 1]
  • M = 4

解:[3, 13, 5] [7, 18] [8] [20, 1],“最胖”的段是[7, 18] = 25(如果我错了请纠正,这个例子是我编的)

我有一种感觉,这是一些经典的 CS/数学问题,可能与某个名人的名字相关联,比如 Dijkstra 问题。 - 有没有已知的解决方案? - 如果没有,除了暴力破解之外,你还能想出其他解决方案吗?据我所知,时间复杂度是这样的,指数。(N^M,更具体地说)。

预先感谢,stackoverflowers。


  1. 让我们对答案进行二分搜索。

  2. 为了得到固定的答案X很容易检查它是否可行(我们可以使用贪心算法(总是取最长的可能线段,使其总和为<= X)并将段数与M).

总时间复杂度为O(N * log(sum of all elements)).

这是一些伪代码

boolean isFeasible(int[] array, long candidate, int m) {
    // Here goes the greedy algorithm.
    // It finds the minimum number of segments we can get(minSegments).
    ...
    return minSegments <= m;
}

long getMinimumSum(int[] array, int m) {
    long low = 0; // too small
    long high = sum of elements of the array // definitely big enough
    while (high - low > 1) {
         long mid = low + (high - low) / 2;
         if (isFeasible(array, mid, m))
             high = mid;
         else
             low = mid;
    }
    return high;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法帮助:如何将数组划分为N个段,且最大段最少(平衡分段) 的相关文章

  • 为什么 array_merge_recursive 不是递归的?

    我最近在我的应用程序中发现了一个由意外行为引起的错误array merge recursive 让我们看一下这个简单的例子 array1 1 gt 1 gt 100 2 gt 200 2 gt 3 gt 1000 3 gt 1 gt 500
  • 如何在 mongo shell 查询中仅投影嵌套数组的匹配字段

    我对 mongodb 相当陌生 我希望这是一个简单的问题 我有一个嵌套架构 其中有一个数组字段 其中该数组的每个项目都是一个本身具有数组字段的对象 例如 gt db mytest insert name a top x 1 y 2 nest
  • 为什么数组不符合 Equatable,而它的项在 Swift 中是 Equatable?

    UPDATE 从 Xcode 9 3 开始 包括斯威夫特 4 1 数组相等按预期工作 并且原始问题中的代码编译没有错误 然而 请查看已接受的答案 因为它提供了更好 更现代的解决方案 原问题如下 当我尝试声明类型为泛型枚举的实例时 Post
  • 去除 OCR 图像处理中的背景颜色

    我正在尝试删除背景颜色 以提高 OCR 对图像的准确性 示例如下所示 我会将所有字母保留在后处理图像中 同时仅删除浅紫色纹理背景 是否可以使用一些开源软件如Imagemagick将其转换为二值图像 黑 白 来实现这一目标 如果背景有不止一种
  • 快速算法可以快速找到一组范围中某个数字所属的范围?

    场景 我有几个数字范围 这些范围不重叠 由于它们不重叠 逻辑结果是任何时候任何数字都不能属于多个范围 每个范围都是连续的 单个范围内没有空洞 因此范围 8 到 16 将真正包含 8 到 16 之间的所有数字 但两个范围之间可能存在空洞 例如
  • MongoDB 全文搜索分数“分数是什么意思?”

    我正在为我的学校开发一个 MongoDB 项目 我有一个句子集合 我进行正常的文本搜索以查找集合中最相似的句子 这是基于评分的 我运行这个查询 db sentences find text search any text score met
  • C# 数组如何存储在内存中

    我想我的主要问题是 只要我不重新初始化 新字节 作为参数传递的数组 这总是有效吗 static unsafe decimal GetDecimal byte ba decimal decimal PTR fixed byte byte PT
  • 在 Actionscript-3 中优化 2D Flash 游戏的动态背景引擎

    编辑2 根据缺乏回复来判断 我开始怀疑我的问题是否足够清楚 请告诉我是否需要详细说明 注意 请参阅底部以获取代码更新 简短介绍 我正在用 ActionScript 编写一个二维 Flash 空间游戏 宇宙无限大 由于这个特性 背景必须动态渲
  • 字节数组到 Excel 工作簿

    我正在尝试将字节数组转换为 Excel 工作簿 当我这样做时 Response BinaryWrite renderedBytes 它工作正常并且文件符合预期 但是当我尝试用我在网上找到的这个来做到这一点时 private Object B
  • 最大化数组中成对距离的总和

    想象一个清单 e1 e2 en 和一个函数f e1 e2 gt number返回常数时间内任意两个元素之间的距离 f e e 0 e1 e2 gt f e1 e2 gt 0 f e1 e2 lt f e1 e3 f e3 e2 目标是排列列
  • 找出区间内绝对差值最小的两个元素

    我给定了一个数组和一个 L R 类型的查询列表 这意味着找到任何两个数组元素之间的最小绝对差 使得它们的索引在 L 和 R 之间 其中数组的起始索引是 1 而不是 0 例如 采用包含元素 2 1 8 5 11 的数组 a 则查询 1 3 将
  • PHP/MySQL - 在数据库中存储数组

    我正在开发一个 PHP 应用程序 它需要将各种设置存储在数据库中 客户经常询问是否可以添加或更改 删除某些内容 这导致了表格设计出现问题 基本上 我有很多布尔字段 它们只是指示是否为特定记录启用了各种设置 为了避免再弄乱表格 我正在考虑将数
  • 难题:需要一个不允许排序和/或散列的“复杂”等价关系/分区的示例

    从问题 分区比排序更容易吗 https stackoverflow com questions 3256468 is partitioning easier than sorting 假设我有一个项目列表和一个 它们之间的等价关系 以及 比
  • 现在我们有了 std::array C 风格的数组还有什么用途呢?

    std array远远优于 C 数组 即使我想与遗留代码进行互操作 我也可以使用std array data 我有什么理由想要一个老式的阵列吗 除非我错过了一些东西 我没有太密切地关注标准中的最新变化 C 风格数组的大部分用法仍然保留 st
  • 单源最短路径,包含每条边的距离和权重

    假设有一个无向图 连接任意两个节点的每条边都有两个权重 即距离和成本 我想要获得最短路径 但也要确保不超出一定的成本 我尝试过实现 Djikstra 如果超出成本 则简单地回溯 由于缺乏更好的术语 直到遍历整个图表 但是 我正在寻找比这更快
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 难以理解如何处理调车场算法的输出

    我一直在看维基页面 http en wikipedia org wiki Shunting yard algorithm http en wikipedia org wiki Shunting yard algorithm 我已经使用代码示
  • 为什么 Numpy 创建零数组比用零替换现有数组的值要快得多?

    我有一个用于跟踪各种值的数组 数组是2500x1700尺寸上 所以不是很大 在会话结束时 我需要将该数组中的所有值重置为零 我尝试创建一个新的零数组并将数组中的所有值替换为零 并且创建一个全新的数组要快得多 代码示例 for in sess
  • 在 C 中声明和初始化数组

    C 有没有办法先声明然后初始化数组 到目前为止 我一直在初始化一个这样的数组 int myArray SIZE 1 2 3 4 但我需要做这样的事情 int myArray SIZE myArray 1 2 3 4 在 C99 中 您可以使
  • 类型错误:对于仅使用浮点数的函数,返回数组必须是 ArrayType

    这个实在是难倒我了 我有一个计算单词权重的函数 我已经确认 a 和 b 局部变量都是 float 类型 def word weight term a term freq term print a type a b idf term prin

随机推荐

  • 检查 ASP.NET CheckboxList 中的多个项目

    我尝试检查 ASP NET CheckboxList 中的多个值 但我做不到 我写 chkApplications SelectedValue 2 chkApplications SelectedValue 6 但它只选择值为 6 的项目怎
  • Tensorflow Dataset.from_generator 失败并出现 pyfunc 异常

    我正在根据需要尝试tensorflow的nightly 1 4Dataset from generator将一些可变长度的数据集拼接在一起 这个简单的代码 想法来自here import tensorflow as tf Dataset t
  • Kubectl 仅获取工作节点

    是否有任何快捷方式或 kubectl 命令或 REST API 调用来仅获取工作节点列表 不包括主节点 Update 对于高手我们可以这样做 kubectl get nodes selector node role kubernetes i
  • 通过r更新postgresql数据库中的表

    如何通过 R 使用新数据更新 postgresql 数据库中的数据 我试过了 dbGetQuery con UPDATE table SET column1 1 column2 2 column3 3 where id 4 data Rda
  • JasperReports 5.6:无法加载以下字体

    我面临的问题是贾斯珀报告仍然找不到 Arial 字体 我创建了一个具有以下结构的简单 Maven 项目 并将其包含到我的主应用程序中 因此主应用程序在类路径中包含已安装的 JAR jasperreports extension proper
  • 限制Python导入的范围

    我有一些代码看起来像这样 from pyparsing import Word alphas Optional Do stuff And at the end save a result to the outside world parse
  • 通过 ADO.NET 检索 SET STATISTICS IO 和 SET STATISTICS TIME 值?

    通过 Management Studio 执行 T SQL 查询时 我可以使用SET STATISTICS IO ON and SET STATISTICS TIME ON捕获查询优化的统计信息 当我使用 NET 客户端 API 执行 T
  • 如何在 C++ 中将 yuy2 转换为 BITMAP

    我正在使用安全摄像头 DLL 从摄像头检索图像 DLL 调用我的程序的函数 将图像缓冲区作为参数传递 但图像是 yuy2 格式 我需要将此缓冲区转换为 RGB 但我尝试了在互联网上找到的每个公式 但没有成功 我尝试过的每个例子 包括http
  • XCode 4 中的“合并高分辨率艺术作品”?

    在 XCode 4 中 当处理 iOS 项目时 也许 XCode 3 中也有 只是我没有注意到 构建设置下有一个名为 组合高分辨率图稿 的字段 可以将其设置为是或否 这个设置具体有什么作用呢 来自 Xcode 的快速帮助 合并高分辨率图稿
  • Intellij 15 + Github - 无法克隆存储库,出现“存储库测试失败”错误

    我有 Intellij 15 和一个 Github 帐户 我正在尝试将两者结合起来 我进入设置 gt 版本控制 并添加了 Github 以及主机 用户名和密码 当我单击 测试 时 它起作用了 我还安装了 GitHub 可执行文件 并将其添加
  • 如何在 ggplot 命令中激活两个不同的scale_fill_manual

    这个问题源于我的较早的一个关于ggplot2中的背景颜色 从那里的答案 我现在可以使用geom rect为我的情节提供五种不同颜色的背景 最重要的是 我想绘制一个使用两种不同颜色的条形图 我可以单独完成这些任务中的每一个 但是当我尝试将它们
  • 错误:灵活数组成员不在结构末尾

    我的结构如下所示 typedef struct storage char data int lost index int lost index size int size int allowed memory key size int al
  • 为什么SetupDiCallClassInstaller函数仅限于64位程序?

    尝试从以 32 位模式编译的程序调用 SetupDiCallClassInstaller 在 64 位 Windows 上失败 显然这是设计使然 但我想知道原因 根据 MSDN 64 位系统上的设备安装 32 位版本的应用程序必须检查 Up
  • Eclipse:我打开了隐藏角色,现在无法关闭

    不知何故 我在 Eclipse 中打开了隐藏字符 它不是一般编辑器首选项中的 空白 字符 打开后 它会在现有字符的基础上添加另一层隐藏字符 然后我有类似的事情 r n 有谁知道这些是什么以及如何删除它们 它位于 首选项 gt 常规 gt 编
  • UIWebView 中的 Cookie

    我有一个 UIWebView 我不希望它存储 cookie 所以在加载 webview 之前我会这样做 NSArray cookies NSHTTPCookieStorage sharedHTTPCookieStorage cookies
  • C++ 将对象写入文件然后再读入? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在c 中进行序列化 如何在C 中实现序列化 这些天我越来越多地使用 C 并且目前只对 ofstream 有过一些体验 大多数上述经验都是对变量进行简单的文件输出并使用 ifstream 读回它们
  • HTML5 游戏(画布)- UI 技术?

    我正在使用 PhoneGap 为移动设备 Android iPhone WebOS 构建 JavaScript HTML5 游戏 使用 Canvas 我目前正在尝试设计如何构建 UI 和游戏板以及它们如何交互 但我不确定最好的解决方案是什么
  • 使用 Git Gui Windows - 如何保存用户凭据 - 用户名和密码

    我知道这个问题之前已被问过 并且我一直在查看此链接 https www kernel org pub software scm git docs git credential store html 总的来说 我对使用适用于 Windows
  • 在最近的时间戳上合并两个 pandas 数据帧

    我有两个 daframe df1 和 df2 df1 is time status 2 2 2015 8 00 am on time 2 2 2015 9 00 am canceled 2 2 2015 10 30 am on time 2
  • 算法帮助:如何将数组划分为N个段,且最大段最少(平衡分段)

    我在一个俄语编程论坛上遇到了这个问题 但还没有想出一个优雅的解决方案 Problem 你有一个数组N 个正整数 你需要把它分成M 个连续段 使得最大段的总和是最小的可能值 我所说的段总数是指其所有整数的总和 换句话说 我想要一个平衡良好的数