安排N人的会议

时间:2012-08-15 18:13:39

标签: arrays algorithm list

问题:有N个人和S个插槽。每个人都有一个他忙碌的老虎机列表。 我们必须找到一个算法找到一个所有这些都是免费的插槽。

我已经知道一个复杂度为O(NS)的算法。需要一个更好的算法。

您可以自由地动态维护不同的数据结构(无论何时安排会议,它们都会更新),这可以用来最终找到一个空闲插槽。

4 个答案:

答案 0 :(得分:2)

为每个插槽保留一个插槽计数器。为每个人忙插槽添加一个槽插槽计数器;为所有人民忙碌的插槽。

任何插槽计数器在考虑所有人都忙的插槽后仍为零,是一个所有人都有空的插槽的计数器。可能是O(k)算法。

而不是计数你可以设置一个位掩码/位集,其中人N的位掩码在它们忙碌的所有位置都设置了位S.所有人的位掩码的按位OR将具有对应于所有空闲时隙的零位。

更新: 你说出问题的方式,你不必跟踪人们只是保留一系列插槽占用指标。最初所有都标记为免费;当你通过每个人忙槽时,将适当的占用指示标记为忙。完成后,任何仍然空闲的阵列指示器都是您的答案。

答案 1 :(得分:0)

编辑: 假设我们有一个每个人的排序列表,Algo将工作

  1. 现在你有N个大小为S(最大)的列表。合并此列表:http://en.wikipedia.org/wiki/Merge_algorithm
  2. 典型的合并排序(使用堆)将导致复杂性NlogK,其中N是所有“K”列表中的元素总数。但是,如果您的版本,N列表中的每个元素都限制在0和s-1之间。因此,复杂性也受S * log(N)的限制。通过具有最大'N'的堆大小的N列表进行迭代,以S迭代为界。有意义吗?
  3. 因此,总体复杂度= N * log(S)+ S * log(N)

    这是假设原始列表已排序,否则复杂性将达到N(SlogS)

答案 2 :(得分:0)

生成大小为S的位掩码,其中的位设置为S忙时。按位或所有位掩码一起,然后提取未设置的位。

答案 3 :(得分:-1)

请记住,可能没有解决方案,Hungarian Algorithm将提供最接近的答案