- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我会尝试用数学语言来解释这个问题。
假设我有一组项目 X = {x_1, x_2, ..., x_n}
。 X
的每一项都属于集合 S_1, S_2, ..., S_5
中的一个。我认为 X
的所有子集都包含 5 个项目:{x_i1, x_i2, ..., xi5}
所以 x_i1
属于 S_1
, ..., x_i5
属于 S_5
。
一些子集被认为是正确的,而一些子集被认为是不正确的。如果子集不包含冲突项,则认为它是正确的。我有一个函数 f1 来确定一对项目是否冲突。
我还有一个函数 f2,它可以比较这些正确的子集并说出哪个子集更好(它们也可能相等)。
我需要找到最好的不冲突的子集。
我使用的算法:
我构建了所有子集,丢弃了不正确的子集。然后我使用 f2 作为排序函数对正确的子集进行排序,并获得第一个最佳子集(我使用快速排序算法)。就存在大量子集而言,此过程花费的时间不足。
在耗时方面是否有更好的方法?
已更新
让我们将 x_i 视为具有整数端点的区间。如果 2 个区间不相交,f1 返回 true,否则返回 false。 f2比较子集中区间的总长度。
最佳答案
本题是最大加权区间调度算法的变体。 DP算法的多项式复杂度为O(N*log(N))
。与 O(N)
天真的问题的空间,和O(2^G * N * logn(N))
O(2^G * N)
的复杂性这个变化问题的空间,其中 G
, N
分别代表组/子集(此处为 5)和间隔的总数。
如果x_i不代表区间,那么问题就出在NP上,其他解法已经证明了这一点。
先讲解最大加权区间调度的动态规划解法,再解变分问题。
start(i)
, end(i)
, weight(i)
区间的起点、终点、区间长度i
分别。1, 2, ... N
.next(i)
表示不与区间 i
重叠的下一个区间.S(i)
是仅考虑作业的最大加权间隔 i, i+1, ... N
.S(1)
是解决方案,它考虑了 1,2,... N
中的所有作业并返回最大加权间隔。S(i)
递归地。.
S(i) = weight(i) if(i==N) // last job
= max(weight(i)+S(next(i)), S(i+1)
这个解决方案的复杂度是 O(N*log(N) + N)
. N*log(N)
寻找 next(i)
对于所有工作,以及 N
用于解决子问题。空间是O(N)
用于保存子问题的解决方案。
现在,让我们解决这个问题的变体。
start(i)
, end(i)
, weight(i)
, subset(i)
是起点,终点,区间长度,区间的子集i
分别。1, 2, ... N
.next(i)
表示不与区间 i
重叠的下一个区间.S(i, pending)
是仅考虑作业的最大加权间隔 i, i+1, ... N
和 pending
是一个子集列表,我们必须从中选择一个区间。S(1, {S_1,...S_5})
是考虑所有工作的解决方案1,...N
, 为 S_1,...S_5
中的每一个选择一个区间并返回最大加权间隔。S(i)
递归如下。.
S(i, pending) = 0 if(pending==empty_set) // possible combination
= -inf if(i==N && pending!={group(i)}) // incorrect combination
= S(i+1, pending) if(group(i) not element of pending)
= max(weight(i)+S(next(i), pending-group(i)),
S(i+1, pending)
请注意,我可能遗漏了一些基本情况。
这个算法的复杂度是 O(2^G * N * logn(N))
与 O(2^G * N)
空间。 2^G * N
表示子问题大小。
作为估计,对于 G<=10
的小值和高值 N>=100000
,这个算法运行得非常快。对于 G>=20
的中值, N<=10000
为了使该算法收敛,它也应该很低。而对于 G>=40
的高值,算法不收敛。
关于在特定约束条件下找到最佳项目组合的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8800226/
这个问题在这里已经有了答案: Different ways of loading a file as an InputStream (6 个答案) 关闭 8 年前。 在我的 gradle java
给定一个 User 类: class User end 我想使用 .class_eval 定义一个新常量.所以: User.class_eval { AVOCADO = 'fruit' } 如果我尝试
这可能听起来很奇怪,但我正在开发一个需要查找 div 内的元素或 div 本身的插件。 脚本根据用户选择查找元素,但内容(包括标记)是可变的。因此脚本将按如下方式查找元素: $('.block').f
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我需要在按我自己的函数排序的对的多集中查找并删除一个值。显然, .find 总是将迭代器返回到末尾,而不是返回到搜索到的值。有小费吗?这是函数: struct cmp { bool operato
求助!我将如何通过遍历查看字符并计算有效字符出现之前的下划线数量来查找和删除前导下划线。以及从字符串末尾向后迭代以查找任何尾随下划线。 我可以使用下面的方法来删除下划线,但是如何迭代才能找到下划线。
如果你在 $(xml) 中有下面的 xml,你会变得懒惰: $(xml).find("animal").find("dog").find("beagle").text() 在 jQuery 中是否有类
你如何找到4个文件的交集? 我用了grep -Fx -f 1.txt 2.txt 3.txt 4.txt ,但它似乎只适用于 2 个文件。同样comm -12 1.txt 2.txt无法扩展为 4 个
我已经完成了标记的姿势估计并获得了 rvec 和 tvec 值。我不知道如何找到它的中心,因为我需要绘制一个需要中心值的圆柱体。 我该怎么做? 最佳答案 标记的 tvec 是标记从原点的平移 (x,y
我有一个任务,我需要找到 2 个单链接(单对单)列表的交集。我还必须为 2 个双向链接(双重 vs 双重)列表执行此操作: 对于单链表,我使用 mergeSort() 对两个列表进行排序,然后逐项比较
我是 R 的新手,我有一个 100x100 的方阵。我想找到这个矩阵的最大特征值。我试过了 is.indefinite(x) 但是它写 is.indefinite(x) : argument x is
您好,我是 svg 和 JavaScript 的新手,当鼠标位于 svg 上方时,我试图使一些 svg 元素弹出(通过缩放),反之亦然,当鼠标离开 svg 元素时。 我已经能够通过使用转换使 svg
我正在尝试为 scala 项目编写一个类,但在多个地方使用 class、def、while 等关键字出现此错误。 它发生在这样的地方: var continue = true while (conti
我有两个 pandas 数据框,它们只取自一列并将日期列设置为索引,所以现在我有两个 Series。我需要找到这些系列的相关性。 这里有几行来自dfd: index change 2018-
我正在尝试调整我的 Vagrantfile,因此如果它丢失,它会自动在项目根目录中创建一个文件夹。创建文件夹没问题,但我无法找到创建该文件夹的位置。 我发现此信息可在 Vagrant::Environ
我正在尝试在 jquery 中找到 Test3 的位置,请有人引导我走上正确的道路。 我需要jquery来显示5 Test7 Test2 Test6 Test5 Test3 Test8 谢谢 最佳
大家早上好 我有一个像这样的图像列表: 使用 jQuery 如何查找 ul#preload 中包含特定字符串(例如“green”)的所有图像 src 类似... var new_src = j
我正在开发一个修改 Excel 文件的应用程序。 如何找到任意行中最后使用的单元格? 示例:行号 => 5 中最后使用的单元格 最佳答案 要找到一行中的最后一个单元格,您需要 Range 的 End
我刚刚陷入 react native ,需要一些帮助才能在找到 token 时导航到 protected 屏幕。我应该在哪里寻找应用程序加载时的 token ?如何在不多次调用导航的情况下导航用户一次
非常奇怪...此页面是 protected 内容还是我不知道的内容?我尝试单击下一页 anchor 。 参见this page first. 我试图用这个来抓取元素 var buttonNext =
我是一名优秀的程序员,十分优秀!