将集合 S 公平划分为 k 个分区

2023-12-14

存在一个集合 S,其中包含 N 个整数,每个整数的值为 1fair还需要定义(例如,目标可能是最小化分区值与集合 S 平均值的标准偏差(即 sum(S)/k))

例如S = {10, 15, 12, 13, 30, 5}, k=3

一个好的分区是 {30}, {10, 15}, {12, 13, 5}

错误的分区是 {30, 5}, {10, 15}, {12, 13}

第一个问题是用数学方式表达一个分区优于另一个分区的条件。 第二个问题是如何解决这个问题。该问题是 NP-Hard 问题。有什么启发法吗?

在我试图解决 N

=================================================== =================================

基于其他相关的 SO 问题,有两个合理的函数来评估分布:

a) 最小化具有最大值的分区的值。

再想一想,这不是一个好的衡量标准。考虑将集合 {100, 40, 40} 划分为三个子集。该指标不区分以下两种分布,即使其中一种明显优于另一种。

分布 1:{100}、{40}、{40} 分布 2:{100}、{40、40}、{}

b) 最小化给定分区中任意两个值的差值的最大值,即最小化 max|A-B|对于任意A、B


我认为一个好的衡量标准是:

let the result set be s1,s2,...,sk
let MAX be max{sum(si) for each i}
f({s1,...,sk}) = Sigma(MAX-sum(si)) for each i)

好处是:完美的分布将始终产生 0!
缺点:如果没有完美的解决方案,最好的结果不会是0。

这个问题的贪心启发式是:

sorted<-sort(S) (let's say sorted[0] is the highest)
s1=s2=...=sk= {}
for each x in sorted:
   s <- find_min() (*)
   s.add(x)

其中 find_min() 产生 s,使得每个 si 的 sum(s)

该解决方案将产生 f(上面定义的指标),使得f(sol) <= (k-1)*max{S}(这里是这个界限的证明):


claim:对于每个子集 s,MAX- sum(s) <= max{S}
proof- 通过归纳法:在每一步中,临时解决方案的断言都是正确的。
在每个步骤中,在迭代开始时(相加之前)让 MAX 为 max{sum(si)}!

base: the set of subsets at start is {},{},.. MAX=sum(si)=0 for each si. 
step: assume the assumption is true for iteration i, we'll show it is also true for iteration i+1:
let s be the set that x was added to, then MAX-sum(s) <= max{S} (induction assumption).
if sum(s) + x <= MAX: we are done, MAX was not changed.
else: we sorted the elements at start, so x <= max{S}, and thus if s was chosen
   (sum(si) >= sum(s) for each si) and sum(s) + x > MAX then: for each si, sum(si) + x >=
   sum(s) + x, so sum(s)+x - sum(si) <= x <= max{S}. since sum(s)+x will be the MAX next 
   iteration, we are done.

因为对于每组MAX-sum(si) <= max{S}(显然,对于最大集合,MAX-sum(si)=0),总体而言Sigma(MAX-sum(si)) <= (k-1)*max{S}, 按照承诺。

EDIT :
I had some spare time, so I programmed both heuristics suggested by me and by @Akhil, and both metrics, first of all, both results are conclusive (according to Wilcoxon's pair-t test), but which is better is defined by which metric you choose, surprisingly, the algorithm which tried to minimize f() (@Akhil`s) scored lower for this same f, but higher for the second metric. @Akhil's metrics graph

@Amit's metrics graph

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

将集合 S 公平划分为 k 个分区 的相关文章

  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 为什么 n 按位和 -n 总是返回最右边的位(最后一位)

    这是Python代码片段 1 1 1 2 2 2 3 3 1 看来任何n n总是返回最右边 最后 位 我真的不知道为什么 有人可以帮助我理解这一点吗 这是由于负数以二进制表示的方式 称为二进制补码表示 创建某个数字 n 的补码 换句话说 创
  • javascript - 找到在一定限制下给出最大总和的子集(子集总和)

    我有一个包含一些整数值的数组 我需要获取它们的子集 该子集给出小于给定值的最大总和 假设我有这个数组 40 138 29 450 我想获得该数组的一个子集 使总和最大化 但低于用户给出的限制 比如说 250 在这种情况下 它应该返回 139
  • std::__gcd 和 std::gcd 有什么区别?

    Many https www geeksforgeeks org stdgcd c inbuilt function finding gcd websites https codeforces com submissions Madiyar
  • 二分查找问题? [复制]

    这个问题在这里已经有答案了 可能的重复 实施二分查找有哪些陷阱 https stackoverflow com questions 504335 what are the pitfalls in implementing binary se
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 在小于 O(N) 的时间内找出点是否位于 N 个(可能重叠)矩形之一内

    我有一个图像 我想在鼠标移动到某些矩形区域时显示工具提示 矩形区域最多可达 1000 个 但是 仅检查每个矩形中是否有点 时间复杂度为 O N 导致移动鼠标时界面无响应 有没有办法在小于 O N 的时间内完成它 我可以预先对矩形进行排序 我
  • 为什么路径压缩不会改变 UnionFind 中的排名?

    我正在研究 UnionFind 的实现 并从这里进行排序和路径压缩http en wikipedia org wiki Disjoint set data struct Disjoint set forests http en wikipe
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • 如何测试哈希函数?

    有没有办法测试哈希函数的质量 我希望在哈希表中使用时具有良好的分布 如果这可以在单元测试中验证 那就太好了 EDIT 为了澄清 我的问题是我已经使用了longJava 中的值的方式是第一个 32 位编码一个 ID 第二个 32 位编码另一个
  • 我可以在线性时间内检查有界列表是否包含重复项吗?

    假设我有一个Int列表 其中元素已知是有界的 并且列表已知不长于它们的范围 因此它完全有可能不包含重复项 如何才能最快地测试是否是这种情况 我知道nubOrd https hackage haskell org package contai
  • Haskell:先进先出队列算法的复杂性

    这是我对 FIFO 队列的尝试 type Queue a a gt a empty Queue a empty id remove Int gt Queue a gt a Queue a remove n queue take n queu
  • 集合成员的 TTL

    Redis 是否可以不为特定键而是为集合的成员设置 TTL 生存时间 我正在使用 Redis 文档提出的标签结构 数据是简单的键值对 标签是包含与每个标签对应的键的集合 例如 gt SETEX id id 1 100 Lorem ipsum
  • 平均值大于或等于 k ​​的最长连续子数组

    考虑一个包含 N 个整数的数组 找到最长的连续子数组 使其元素的平均值大于 或等于 给定数字 k 显而易见的答案具有 O n 2 复杂度 我们可以做得更好吗 我们可以通过在 O n 时间内从所有值中减去 k 将这个问题简化为 sum gt
  • 数独生成器算法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我制作了一个生成数独的算法 但效率非常低 每个谜题都需要几分钟才能生成 所以现在我正在尝试以最佳方式重新编写它 但我遇到了一些问题 需
  • java中的散列是如何工作的?

    我正在尝试弄清楚java中的哈希值 例如 如果我想在哈希图中存储一些数据 它是否会有某种带有哈希值的底层哈希表 或者 如果有人能够对哈希的工作原理给出一个很好且简单的解释 我将非常感激 HashMap 基本上在内部实现为数组Entry 如果
  • 有向无环图的拓扑排序为阶段

    是否有一种算法 给定一个未加权的有向无环图 将所有节点排序到节点集列表中 使得 拓扑顺序被保留 即 对于所有边u gt v v出现在列表中更靠下的集合中u and 列表的长度是最小的 这个问题有名字吗 Example 下图的一种可能的排序是
  • boost::graph 算法是否能够使用以前的解决方案更快地解决密切相关的新问题?

    我在下图中定义了最大流量问题 最初 所有四个边缘的容量均为 4 个单位 我求从 0 到 3 的最大流量值 答案是 8 沿路径 0 gt 1 gt 3 4 个单位 沿路径 0 gt 2 gt 3 4 个单位 以下代码创建图表并查找最大流量 i
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数

随机推荐

  • Pytesseract OCR 多个配置选项

    我在使用 pytesseract 时遇到一些问题 我需要将 Tesseract 配置为接受个位数 同时也只能接受数字 因为数字零经常与 O 混淆 像这样 target pytesseract image to string im confi
  • 迁移到 .NET 6 后找不到视图

    我将 ASP NET CORE MVC 项目从 NET Core 2 1 迁移到 NET 6 进行相关更改后 项目编译并启动看似正常 但找不到视图 根路径已设置app Environment ContentRootPath Director
  • 我在 Google Play 开发者控制台中遇到的崩溃和 ANR 错误比 Firebase Crashlytics 中的要多。这正常吗?

    过去 30 天内 我在 Firebase Crashlytics 和 Google Play 开发者控制台中看到了我的应用程序的崩溃和 ANR 错误报告 这是我所看到的 Firebase Crashlytics 总共 5 次崩溃 ANR G
  • Excel 和 C# 应用程序之间的进程间通信?

    我想知道是否有一种方法可以在 excel 实例和 C 应用程序之间建立通信 例如 当单元格值发生变化时 我想将更新后的值实时发送到 C 应用程序 提前致谢 你需要办公室主要互操作程序集 它们是 MS Office 公开的 COM API 的
  • Swift 中的泛型和函数式编程

    下面 sum 函数的两个变体是我尝试用 Swift 重复 Abelson 和 Sussman 在经典的 计算机程序的结构和解释 一书中介绍的 lisp 版本 第一个版本用于计算某个范围内的整数之和 或某个范围内的整数的平方和 第二个版本用于
  • tvOS UITextField 编辑后为空

    Editing UITextFieldtvOS 中显示了一个新视图 用户可以在其中输入文本 完成文本输入后 用户将返回到之前的视图 但是 我发现当我从文本编辑器返回时 我编辑的文本不会显示在我的文本字段中 这是怎么回事 电视操作系统版本9
  • MySQL,多行分隔字段

    我有一个 MySQL 表 其中包含如下字段和数据 PartNumber Priority SupName a1 0 One a2 0 One a2 1 Two a3 0 One a4 1 Two a5 2 Three 我正在尝试创建一个视图
  • C# 无协议 SuperSocket

    问题很简单 我已阅读全文超级插座文档 但我不明白是否有一种方法可以在不实现协议的情况下使用它 我不需要发送特定的命令 而只需发送可能是一个或数百个字节 具体取决于许多因素 我需要更新一个使用简单套接字的旧 TCP 服务器 它是我在 4 年前
  • 如何使用 webpack 混淆 js 文件

    我想在 public js 中混淆我的 js 文件 但在混淆之前 是否可以先在我的 public 文件夹外部的其他目录中传输 然后混淆的结果将在 public js 中 先感谢您 我的回答来得很晚 但我建议https obfuscator
  • 值类型何时存储在堆栈中(C#)?

    当我阅读下一本书的 值和引用类型 一章时 我想到了一个问题 值类型何时存储在堆栈中 因为程序员无法在类外初始化任何值类型 因为当我们在类中初始化一些值类型的变量时 变量就会存储在堆中 我的问题是 值类型什么时候存储在堆栈中 好吧 首先 您很
  • CMake 无法与 Google Protobuf 配合使用

    无法使用 CMake 链接 protobuf 库 我的 CMakeLists 是 cmake minimum required VERSION 3 6 project addressbook set CMAKE CXX STANDARD 1
  • 不带计数器的自定义周期函数

    我在用ode45求解一个简单的 ODE function dCdt u vent t C if t gt 600 t lt 720 Q Q2 elseif t gt 1320 t lt 1440 Q Q2 elseif t gt 2040
  • 获取日期时间之间的时间差

    如何求2次之间的差值 例子 var now 04 09 2013 15 00 00 var then 04 09 2013 14 20 30 expected result 00 39 30 I tried var now moment 0
  • JavaScript 监听器不断增加

    我实现了一个网络应用程序并使用谷歌开发人员工具监控了性能 我注意到听众不断增加 听众数量也在不断增加 听众增加的部分看起来像这样 let ival interval function http get someurl this call i
  • 使用 ffmpeg 进行转换,无需执行

    我的 Windows XP Apache PHP 5 3 和 ffmpeg 工作正常 我需要将 flv 转换为 avi 或反之亦然 而不使用exec 命令 这可能吗 谢谢 编辑 我希望有人可以编辑 ffmpeg 源代码并在 php 扩展中实
  • csh 上的自连接字符串

    我需要将 argv 中的部分内容连接到我的变量之一 我将向您展示我的代码 bin csh set stringList foreach param argv if param TEST then set stringList stringL
  • 为什么不使用 IoC 容器来解决实体/业务对象的依赖关系?

    我了解 DI 背后的概念 但我只是在学习不同的 IoC 容器可以做什么 似乎大多数人都主张使用 IoC 容器来连接无状态服务 但是将它们用于实体等有状态对象呢 无论是对还是错 我通常都会用行为填充我的实体 即使该行为需要外部类 例子 pub
  • CSS3:检测 iPhone 的设备方向

    所以这个声明适用于 iOS 4 和 4 1 但不适用于旧版本 有什么建议吗 media screen and device width 320px and orientation portrait iPhone Portrait Style
  • 当值改变时MySQL增加用户变量

    我有一个由组组成的表 例如 每组五行 每组中的每一行都拥有一个date该群体独有的价值 我想要在查询中执行的操作是遍历表 并在执行此操作时增加用户变量 count date值变化 也就是说 count 应该等于组数 而不是行数 我当前的查询
  • 将集合 S 公平划分为 k 个分区

    存在一个集合 S 其中包含 N 个整数 每个整数的值为 1fair还需要定义 例如 目标可能是最小化分区值与集合 S 平均值的标准偏差 即 sum S k 例如S 10 15 12 13 30 5 k 3 一个好的分区是 30 10 15