m个消费者消耗n个项目的步数

时间:2017-06-26 11:51:33

标签: java algorithm performance

我的问题可以简化为以下几点:

问题陈述:

我有n个商品和m个消费者。每个项目都有一些s(正整数)。

在一个步骤中,每个消费者都可以选择一个项目,并将其大小减少1。两个消费者不能选择相同的商品,一个商品可以不被选择(想象一个从消费者到商品的内在功能)。

我的问题:

消耗所有项目所需的最小步骤数(所有项目的大小为0)是什么?

注意:我不确定这个问题的复杂性,如果解决方案不是最优的,我很好,接近最佳状态就好了。

示例:

// First example:
// number of items
n = 4;

// size of each item, itemSizes[i] represents the size of item i
int[] itemSizes = {1, 1, 2, 4};

// number of consumers
m = 3;

// the result should be 4
int result = computeMinimumNumberOfSteps(n, m, itemSizes);


// Second example:
// number of items
n = 4;

// size of each item, itemSizes[i] represents the size of item i
int[] itemSizes = {4, 9, 5, 5};

// number of consumers
m = 2;

// the result should be 13
int result = computeMinimumNumberOfSteps(n, m, itemSizes);

我的方法:

我使用贪婪的方法。我曾经重复以下步骤,直到所有物品被消耗掉:

  1. 选择m个最大的项目(排序并选择m
  2. 的第一个size != 0
  3. 将其尺寸减少1(消耗)
  4. 更新步骤数(步骤++)
  5. 这似乎很慢,现在我做了:

    1. 选择m个最大的项目(排序并选择m
    2. 的第一个size != 0
    3. min个项目中找到最小值m
    4. 将其尺寸减小最小值min(合并多个消耗步骤)
    5. 更新步骤数(步骤+ =分钟)
    6. 这似乎仍然太慢了。您如何看待我的方法?有没有办法进一步提高速度?

      此外,问题似乎很普遍,你知道我的问题可以减少的任何众所周知的问题吗?

1 个答案:

答案 0 :(得分:3)

您的问题等同于调度问题P | pmtn | C max ,即您有多台并行机器P,您的作业可以被抢占(pmtn)并且您希望最小化最大值品牌时间C max

McNaughton的规则为这个问题提供了最佳解决方案,您可以在David Karger等人的论文Scheduling Algorithms中找到它的参考。 (第2.3.1章)。基本上,您为消费者分配任意项目,直到达到 D = max(sum(itemsizes)/ m,max(itemSizes)),然后继续下一个消费者。因此,该算法的运行时间为 D