algorithm - 没有前瞻性的桶之间的加权分布

标签 algorithm random average distribution weighted

我有 N 个工作人员需要处理传入的数据批处理。每个工作人员都经过配置,使其知道自己是“N 中的工作人员 X”。

每批传入的数据都有一个随机唯一的ID(随机,均匀分布),并且大小不一;处理时间与大小成正比。尺寸可能相差很大。

当一批新数据可用时,所有 N 个工作人员都可以立即看到它,但我希望只有一个工作人员实际处理它,他们之间没有协调。现在,每个工作人员计算 ID % N == X,这是真的,工作人员自行分配批处理,而其他工作人员则跳过它。这可以正常工作,并确保每个工作人员平均处理相同数量的批处理。不幸的是,它没有考虑批处理大小,因此一些工作人员可以比其他工作人员更晚完成处理,因为他们可能碰巧自行分配非常大的工作。

我如何更改算法,以便每个工作人员以也考虑批处理大小的方式自行分配批处理,以便平均而言,每个工作人员将自行分配相同的总工作量(来自不同批处理)?

最佳答案

//Using a queue to store the workers
//This way we can dequeue and reenqueue workers when they accept jobs
var _queue = new Queue<Worker>[numOfWorkers];

void Setup() {
  for (int i = 0;i<numOfWorkers -1;i++) {
      _queue.Enqueue(new Worker());
  }
}

//Assigns the job to the next worker in line and puts it at the end of queue
void AcceptJob(Job j) {
    var w = FindNextAvailableWorker();
    w.AssignNewJob(j);
    _queue.Enqueue(_queue.RemoveAt(_queue.PositionOf(w)));
}

//Finds the first free worker or returns the front of queue
Worker FindNextAvailableWorker() {
    var w = _queue.front();

    while (int i=0;i<_queue.length-1<i++) {
        if (_queue[i].isWorking==false){
            w = _queue[i];
            exit loop;
        }  
    }

    return w; 
}

关于algorithm - 没有前瞻性的桶之间的加权分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39707713/

相关文章:

javascript - 从 1's and 0' 的字符串中选择随机数并改变颜色

c++ - 在C++中从文件中查找平均工资

algorithm - 如何在容器之间对加权项目进行平均排序?

algorithm - 在树结构中合并分支的模式或算法?

java - 大哦 (n log n)

c++ - 具有高概率数字的随机)?

Java 生成的 token 不是随机的——但它是什么?

algorithm - 这些数字之间有什么关系?

java - 如何计算数组中所有非负数的平均值

计算数组中整数的平均值