Arrays 安排N人的会议

Arrays 安排N人的会议,arrays,algorithm,list,Arrays,Algorithm,List,问题:有N个人和S个插槽。每个人都有一张自己忙碌的时段列表。 我们必须找到一个algo来找到一个他们都是免费的插槽 我已经知道一个算法,它的复杂度是O(NS)。需要一个更好的算法 您可以自由地动态维护不同的数据结构(无论何时安排会议,这些数据结构都会更新),这些数据结构可用于最终找到可用的插槽。为每个插槽保留一个插槽计数器。对于每个忙碌的人,在插槽计数器中添加一个插槽;为了所有忙碌的人 任何在计算了所有人的繁忙时段后仍然为零的时段计数器都是所有人空闲时段的计数器。可能是一个O(k)算法 您可以设

问题:有N个人和S个插槽。每个人都有一张自己忙碌的时段列表。 我们必须找到一个algo来找到一个他们都是免费的插槽

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


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

为每个插槽保留一个插槽计数器。对于每个忙碌的人,在插槽计数器中添加一个插槽;为了所有忙碌的人

任何在计算了所有人的繁忙时段后仍然为零的时段计数器都是所有人空闲时段的计数器。可能是一个O(k)算法

您可以设置一个位掩码/位集,其中person N的位掩码在其忙碌的所有位置都设置了位s,而不是计数。所有位掩码的按位OR将具有与所有空闲插槽对应的零位

更新:
按照您陈述问题的方式,您不必跟踪人员,只需保留一组插槽占用率指示器即可。最初,所有标记都是免费的;当您通过每个“忙”时段时,将相应的占用指示器标记为“忙”。完成后,仍然可用的任何阵列指示器都是您的答案。

为每个插槽保留一个插槽计数器。对于每个忙碌的人,在插槽计数器中添加一个插槽;为了所有忙碌的人

任何在计算了所有人的繁忙时段后仍然为零的时段计数器都是所有人空闲时段的计数器。可能是一个O(k)算法

您可以设置一个位掩码/位集,其中person N的位掩码在其忙碌的所有位置都设置了位s,而不是计数。所有位掩码的按位OR将具有与所有空闲插槽对应的零位

更新: 按照您陈述问题的方式,您不必跟踪人员,只需保留一组插槽占用率指示器即可。最初,所有标记都是免费的;当您通过每个“忙”时段时,将相应的占用指示器标记为“忙”。完成后,仍然可用的任何阵列指示器都是您的答案。

编辑: 假设每个人都有一个已排序的插槽列表,Algo就可以工作了

  • 现在您有N个列表,每个列表的大小为S(最大值)。合并排序此列表:
  • 典型的合并排序(使用heap)将导致复杂性NlogK,其中N是所有“K”列表中元素的总数。但是,如果是您的版本,则N列表中的每个元素都被限定在0和s-1之间。因此,复杂性也以S*log(N)为界。在堆大小为最大“N”的N个列表中迭代,以S个迭代为界。有道理吗
  • 因此,总体复杂性=N*log(S)+S*log(N)

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

    编辑: 假设每个人都有一个已排序的插槽列表,Algo就可以工作了

  • 现在您有N个列表,每个列表的大小为S(最大值)。合并排序此列表:
  • 典型的合并排序(使用heap)将导致复杂性NlogK,其中N是所有“K”列表中元素的总数。但是,如果是您的版本,则N列表中的每个元素都被限定在0和s-1之间。因此,复杂性也以S*log(N)为界。在堆大小为最大“N”的N个列表中迭代,以S个迭代为界。有道理吗
  • 因此,总体复杂性=N*log(S)+S*log(N)


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

    考虑到可能没有解决方案,将提供最接近的答案

    考虑到可能没有解决方案,将提供最接近的答案

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

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

    您能描述一下O(ns)算法吗?你能解释一下为什么你认为它是O(ns)吗?我无法想象有数百万人(N个大)每个人都有数十亿个插槽(S个大)的情况,因此O(你可以尝试猜测随机插槽:可能是O(NS),但有可能会更少。你的问题的输入不是N和S,而是k=O(NS)元组(N,S)这表明人员n在插槽s中忙。因此,您实际上在寻找O(k)算法;这是您所能做的最好的,因为扫描输入会花费那么长的时间。这取决于您的O(n)算法算法工作,它可能已经是最优的。如果每个插槽有一个人的约束,这是一个在运行时无法解决的二分匹配问题。编辑是一个二分图,但所述问题是寻找具有0个邻居的插槽节点。您能描述O(ns)吗算法?你能详细解释一下为什么你认为它是O(ns)吗?我无法想象有数百万人(N个大)每个人都有数十亿个插槽(S个大),所以O(你可以尝试猜测随机插槽:它是O(ns),但有可能会更少。你的问题的输入不是真正的N和S,而是k=O(ns)元组(n,s)表示人员n在插槽s中忙。因此,您实际上是在寻找O(k)算法;这是您所能做的最好的方法,因为仅扫描输入就需要那么长的时间。这取决于您的O(n)的方式算法工作,它可能已经是最优的。如果每个插槽有一个人的约束,这是一个在运行时无法解决的二分匹配问题。编辑是一个二分图,但指定的问题是寻找具有0个邻居的插槽节点。步骤1肯定是O(N*SlogS)每种类型的标语都做了N次。你在你的解决方案中重新定义N:首先它是人的数量,然后是(人,忙时间)对的数量。