【发布时间】:2013-12-30 04:31:25
【问题描述】:
感谢 user3125280,D.W.和 Evgeny Kluev 问题已更新。
我有一个网页列表,我必须经常下载它们,每个网页都有不同的下载频率。根据这个频率,我们将网页分为 5 组:
Items in group 1 are downloaded once per 1 hour
items in group 2 once per 2 hours
items in group 3 once per 4 hours
items in group 4 once per 12 hours
items in group 5 once per 24 hours
这意味着,我们必须在 1 小时内下载所有第 1 组网页,在 2 小时内下载所有第 2 组网页等等。
我正在尝试制作一个算法。作为输入,我有:
a) DATA_ARR = 一个包含 5 个数字的数组。每个数字代表该组中的项目数。
b) TIME_ARR = 一个包含 5 个数字(1、2、4、12、24)的数组,表示下载项目的频率。
b) X = 每小时下载的网页总数。这是使用 items_in_group/download_frequently 计算的并向上四舍五入。 If we have 15 items in group 5, and 3 items in group 4, this will be 15/24 + 3/12 = 0.875 and rounded is 1.
每小时我的程序必须在最多X 个站点下载。我希望算法输出如下内容:
Hour 1: A1 B0 C4 D5
Hour 2: A2 B1 C2 D2
...
A1 = 第一组的第二项
C0 = 第三组的第一项
我的算法必须尽可能高效。这意味着:
a) 模式必须可扩展到至少 200 多个小时
b) 无需创建可重复的模式
c) 尽可能需要空间以使用绝对最小带宽
d) 下载项目的频率永远不要超过更新频率,没有例外
示例:
group 1: 0 items | once per 1 hour
group 2: 3 items | once per 2 hours
group 3: 4 items | once per 4 hours
group 4: 0 items | once per 12 hours
group 5: 0 items | once per 24 hours
我们计算每小时可以带走的物品数量:3/2+4/4 = 2.5. We round this upwards and it's 3.
使用铅笔和纸,我们可以找到以下解决方案:
Hour 1: B0 C0 B1
Hour 2: B2 C1 c2
Hour 3: B0 C3 B1
Hour 4: B2
Hour 5: B0 C0 B1
Hour 6: B2 C1 c2
Hour 7: B0 C3 B1
Hour 8: B2
Hour 9: B0 C0 B1
Hour 10: B2 C1 c2
Hour 11: B0 C3 B1
Hour 12: B2
Hour 13: B0 C0 B1
Hour 14: B2 C1 c2
and continue the above.
我们每 4 小时接受一次 C0、C1 C2 和 C3。我们还每 2 小时服用一次 B0、B1 和 B2。
问题:请给我解释一下,如何设计一个能够下载项目的算法,同时使用绝对最小下载次数?蛮力不是解决方案和算法必须是高效的 CPU 明智的,因为元素的数量可能很大。
您可以阅读此处发布的答案:https://cs.stackexchange.com/a/19422/12497 以及 user3125280 在下面发布的答案。
【问题讨论】:
-
更好,但我们称这是一个 c++ 问题,并删除所有其他语言的标签。
-
您的具体问题是什么?
-
@paqogomez 我看不到 C++;我删除了除“c”之外的所有内容,哎呀,错过了标准输出
-
您不应该重新发布已删除的问题,您应该努力修复previous post,但实际上只有 10k+ 用户可以查看它。
-
我添加了更多标签,以便更多人查看我所理解的内容,并且可以使用我标记的所有语言编写代码。 cout 也是 C++。不管怎样,我是新人,所以我会在这里听前辈的。 @Digital_Reality:在给定的“刷新时间”内,我们必须至少从该组中取出每个项目一次。您可以在 codepad.org 上运行我的代码并查看。这将帮助您了解更多。
标签: algorithm