- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近在 Tardos 和 Kleinberg 的算法设计的第 4 章中阅读了有关间隔调度算法的内容。为间隔调度问题提供的解决方案是这样的:
Sort the n intervals based on their finishing time and store in array F
A = [] #list of intervals
S = array with property that S[i] contains the finishing time of the ith interval
i = 0
For j = 0 to n-1
if S[j] >= F[i] #this interval does not overlap with the ith interval
i = j
A.add(j)
C++/Java/Python 中的算法可以在这里找到:http://www.geeksforgeeks.org/greedy-algorithms-set-1-activity-selection-problem/
问题的扩展,也称为区间着色问题,可以解释如下。
We are given a set of intervals, and we want to colour all intervals so that intervals given the same colour do not intersect and the goal is to try to minimize the number of colours used.
书中提出的算法是这样的:
Sort the intervals by their start times in a list I
n = len(I)
For j = 1 to n:
For each interval I[i] that precedes I[j] and overlaps it:
Exclude the label of I[i] from consideration for I[j]
The jth interval is assigned a nonexcluded label
但是这个算法的运行时间不是O(n^2)吗?我想到了一个更好的,但我不确定它是否正确。基本上,我们修改了间隔调度的算法。
Sort the n intervals based on their finishing time and store in array F
A = []
x = 1
S = array with property that S[i] contains the finishing time of the ith interval
i = 0
while F is not empty:
new = []
For j = 0 to n-1
if S[j] >= F[i] #this interval does not overlap with the ith interval
i = j
A.add(F[j])
else:
new.add(F[j])
F = new
Recompute S
print x, A
A = []
x++
我的伪代码中可能有一个愚蠢的错误,但我希望你能理解我的算法试图做什么。基本上,我通过重复运行标准间隔调度算法来去除所有可能的着色。
那么,我的算法不应该打印区间的所有各种颜色吗?如果它是正确的算法,这是否比以前的算法更有效?如果不是,能否请您提供一个反例?谢谢!(更多关于间隔调度的信息:https://en.wikipedia.org/wiki/Interval_scheduling)
最佳答案
您的算法可能会产生次优解决方案。以下是您的算法将生成的示例:
--- -----
----
------------
很明显,对于相同的输入,以下 2 色解决方案(将由经过验证的最优算法生成)是可能的:
--- ------------
---- -----
最后,尽管本书提出的算法的伪代码描述确实看起来确实需要 O(n^2) 时间,但可以使用其他数据结构加快速度。这是一个 O(n log n) 算法:不是遍历所有 n 个间隔,而是按递增顺序遍历所有 2n 个间隔端点。维护一个按颜色排序的可用颜色堆(优先级队列),最初包含 n 种颜色;每次我们看到一个区间起点,从堆中提取最小的颜色并将其分配给这个区间;每次我们看到间隔终点时,将其分配的颜色重新插入堆中。处理的每个端点(开始或结束)都是 O(log n) 时间,并且有 2n 个。这与对间隔进行排序的时间复杂度相匹配,因此整体时间复杂度也是 O(n log n)。
关于algorithm - 贪心算法的最优算法 : Interval Scheduling - Scheduling All Intervals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613908/
我有两个 TIMESTAMP 和一个 INTERVAL。我想知道间隔有多少次适合时间戳之间的间隙。 减去两个 TIMESTAMP 得到一个 INTERVAL。 SELECT TIMESTAMP '20
我最近在 Tardos 和 Kleinberg 的算法设计的第 4 章中阅读了有关间隔调度算法的内容。为间隔调度问题提供的解决方案是这样的: Sort the n intervals based on
这个问题在这里已经有了答案: Stop setInterval call in JavaScript (9 个回答) 关闭 4 年前。 文档指出 clearInterval() 需要在 setInt
我希望能够使用一个蓝牙适配器在两个广告数据之间切换,最佳的广告切换间隔是多少,以及要立即被 iOS 识别而没有太多延迟的广告间隔是多少? (我想在 iBeacon 和 GATT 服务广告之间切换)。现
直观上,这两个间隔代表相同的时间量。但区别在于夏令时的变化,在这种情况下,“1 天”在 Spring 可能表示“23 小时”,在秋季可能表示“25 小时”。 我用 PostgreSQL 进行了测试,这
我需要在 Oracle 数据库中生成一个值列表,其中包含以下列数据: ITEM_TYPE VARCHAR2(20) ITEM_LAST_UPDATED DATE ITE
我遇到了一种合并重叠间隔的方法。它有一个部分我不明白: Collections.sort(intervals, new Comparator() { @Override public
我正在尝试从 Analytics Vidhya 做贷款预测的机器学习练习题。当我使用随机森林分类器时,它显示: TypeError:float() argument must be a string
我想为数据帧中的每一行分配一个间隔,这样所有行就不会重叠并覆盖整个可能的范围。因此,我可以根据给定间隔内的值过滤行。 我使用过 pd.Interval,但是当我尝试“正常”过滤时它不起作用: df =
在 Joda-Time 中, Interval.contains(Interval) 的实现看起来像这样: return (thisStart <= otherStart && otherStart
我有一个使用 AngularJS 间隔功能连续运行的毫秒时间。我创建了一个暂停 和继续 按钮。当点击 Pause 按钮时,它将触发 AngularJS 的 Interval.cancel 功能,如果我
我在训练 LR 模型时使用 sklearn2pmml.preprocessing.CutTransformer 和 sklearn.preprocessing.LabelEncoder 对目标进行编码
我想用 interval = alt.selection_interval(encodings=['x']) 在只有一个图表上缩放/调整大小到我选择的间隔(从 mousedown 到 mouseup)
我正在使用kafka 0.10.1.1,并与以下3个属性混淆。 heartbeat.interval.ms session.timeout.ms max.poll.interval.ms heartb
我正在尝试保留数据库标志 30dexpf = 1 直到项目的到期日期等于或介于接下来的 7 天和 30 天之间这是我的数据库表 30dexpf | expiry --------|-------- 0
我正在 Informix 中执行以下操作以删除超过 20 秒的行。 delete from sometable where someDateColumn < (current - interval (
我在 Controller 中有一个基于 setInterval 的函数。我注意到,在第一次调用它之后,它工作得很好,但即使在路线改变后它仍然继续。之后我尝试使用 native $interval 服
我正在尝试创建一个按钮,单击该按钮将启动计时器,第二次单击将停止计时器,并将“按钮”的innerHtml更改为您停止计时器的时间。然而,它不适用于我在下面编写的代码,间隔只是继续进行,似乎每次点击都会
我是编程新手,最近一直在研究 AngularJS。 为了练习,我决定尝试制作一个简单的秒表。 从初始“时间”值 0 开始,我使用 $interval 将“时间”每 10 毫秒递增 0.01。我可以毫无
我正在尝试将间隔*[a,b]*除以保存在浮点变量数组中的*npt*点。 我需要 *a* 和 *b* 始终出现在最终数组中,并且 *npt* 可以根据我的需要进行变化。 我尝试过: delta = (b
我是一名优秀的程序员,十分优秀!