问题:有N个人和S个插槽。每个人都有一个他忙碌的老虎机列表。 我们必须找到一个算法找到一个所有这些都是免费的插槽。
我已经知道一个复杂度为O(NS)的算法。需要一个更好的算法。
您可以自由地动态维护不同的数据结构(无论何时安排会议,它们都会更新),这可以用来最终找到一个空闲插槽。
答案 0 :(得分:2)
为每个插槽保留一个插槽计数器。为每个人忙插槽添加一个槽插槽计数器;为所有人民忙碌的插槽。
任何插槽计数器在考虑所有人都忙的插槽后仍为零,是一个所有人都有空的插槽的计数器。可能是O(k)算法。
而不是计数你可以设置一个位掩码/位集,其中人N的位掩码在它们忙碌的所有位置都设置了位S.所有人的位掩码的按位OR将具有对应于所有空闲时隙的零位。
更新: 你说出问题的方式,你不必跟踪人们只是保留一系列插槽占用指标。最初所有都标记为免费;当你通过每个人忙槽时,将适当的占用指示标记为忙。完成后,任何仍然空闲的阵列指示器都是您的答案。
答案 1 :(得分:0)
编辑: 假设我们有一个每个人的排序列表,Algo将工作
因此,总体复杂度= N * log(S)+ S * log(N)
这是假设原始列表已排序,否则复杂性将达到N(SlogS)
答案 2 :(得分:0)
生成大小为S的位掩码,其中的位设置为S忙时。按位或所有位掩码一起,然后提取未设置的位。
答案 3 :(得分:-1)
请记住,可能没有解决方案,Hungarian Algorithm将提供最接近的答案