查找所有参与者都可以参加的会议时段的算法

2024-02-07

在采访博客中遇到这个问题。给出表格中的空闲时间安排(a - b) i.e., from 'a' to 'b' of n人们,打印所有时间间隔,其中所有n参与者有空。它就像一个日历应用程序,建议可能的会议时间。

Example:

Person1: (4 - 16), (18 - 25)
Person2: (2 - 14), (17 - 24)
Person3: (6 -  8), (12 - 20)
Person4: (10 - 22)

Time interval when all are available: (12 - 14), (18 - 20).

请分享任何已知的最佳算法来解决这个问题。

我正在考虑以下解决方案。

  • 创建一个currentList包含每个人的一个间隔的间隔。最初currentList = [4-16, 2-14, 6-8, 10-22].

  • 寻找max_start and min_end in currentList和输出(max_start, min_end) if max_start < min_end;更新所有间隔currentList具有start价值为min_end。删除有的区间min_end from currentList并将该人列表中的下一个条目添加到currentList.

  • If max_start >= min_end在上一步中,更新所有间隔currentList具有start价值为max_start。如果对于任意区间i, end > start,将该区间替换为currentList与相应人的下一个间隔。

基于上述想法,对于给定的示例,它将运行如下:

currentList = [4-16, 2-14, 6-8, 10-22]   max_start=10 >= min_end=8

update start values to be 10 and replace 6-8 with next entry 12-20.

currentList = [10-16, 10-14, 12-20, 10-22] max_start=12 <= min_end=14

add max_start-min_end to output and update start values to 14. Output=[12-14]

currentList = [14-16, 17-24, 14-20, 14-22] max_start=17 >= min_end=16

update start values to be 17 and replace 14-16 with 18-25

currentList = [18-25, 17-24, 17-20, 17-22] max_start=18 <= min_end=20

add max_start-min_end to output and update start values to 20. Output=[12-14, 18-20]

currentList = [20-25, 2-24, - , 2-22]

Terminate now since there are no more entry from person 3.

不过我还没有实现上述内容。我正在考虑使用最小堆和最大堆来获取任意点的最小值和最大值。但我担心更新起始值,因为更新堆可能会变得昂贵。


今天在面试的时候得到了这个。想出了一个O(N*logN)解决方案。想知道是否有O(N)可用解决方案...

概述:将各个时间表合并到一个列表中intervals--> 按间隔的开始时间排序 --> 如果交叉则合并相邻间隔 --> 现在返回可用性很容易。

import unittest


# O(N * logN) + O(2 * N) time
# O(3 * N) space

def find_available_times(schedules):
    ret = []

    intervals = [list(x) for personal in schedules for x in personal]

    intervals.sort(key=lambda x: x[0], reverse=True)  # O(N * logN)

    tmp = []

    while intervals:
        pair = intervals.pop()    
    
        if tmp and tmp[-1][1] >= pair[0]:
            tmp[-1][1] = max(pair[1], tmp[-1][1])

        else:
            tmp.append(pair)
    
    for i in range(len(tmp) - 1):
        ret.append([tmp[i][1], tmp[i + 1][0]])    

    return ret


class CalendarTests(unittest.TestCase):

    def test_find_available_times(self):
        p1_meetings = [
            ( 845,  900),
            (1230, 1300),
            (1300, 1500),
        ]

        p2_meetings = [
            ( 0,    844),
            ( 845, 1200), 
            (1515, 1546),
            (1600, 2400),
        ]

        p3_meetings = [
            ( 845, 915),
            (1235, 1245),
            (1515, 1545),
        ]

        schedules = [p1_meetings, p2_meetings, p3_meetings]
       
        availability = [[844, 845], [1200, 1230], [1500, 1515], [1546, 1600]]

        self.assertEqual(
            find_available_times(schedules), 
            availability
            )


def main():
    unittest.main()


if __name__ == '__main__':
    main()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找所有参与者都可以参加的会议时段的算法 的相关文章

  • springboot中使用Schedule注解时@Value以及@Autowired报空指针异常

    文章目录 64 Value报空指针 64 Autowired空指针自定义定时器就不会有注解空指针的问题了参考文章 64 Value报空指针 在使用 64 value注解获取application properties文件的内容的时候 由于使
  • Java定时注解@Scheduled的使用,fixedDelay,fixedRate,cron的使用

    Java定时注解 Scheduled的使用 fixedDelay fixedRate cron的使用 问题背景 参数简介 项目创建 测试结果 心得 Lyric 咸咸的汗水 问题背景 项目中经常使用定时任务 spring提供了定时注解 很方便
  • SpringBoot:@Schedule定时任务

    一 Schedule SpringBoot内置了Sping Schedule定时框架 通过注解驱动方式添加所注解方法到定时任务 根据配置定时信息定时执行 二 定时任务实现 1 开启定时任务 package com gupao springb
  • java Timer(定时调用、实现固定时间执行)

    最近需要用到定时调用的功能 可以通过java的Timer类来进行定时调用 下面是有关Timer的一些相关知识 其实就Timer来讲就是一个调度器 而TimerTask呢只是一个实现了run方法的一个类 而具体的TimerTask需要由你自己
  • java中定时任务 schedule 分布式下没有锁住 时间不同步 执行滞后 相对时间 系统时间 spring springboot

    java util Timer计时器可以进行 管理任务延迟执行 如1000ms后执行任务 及周期性执行 如每500ms执行一次该任务 但是 Timer存在一些缺陷 应考虑使用ScheduledThreadPoolExecutor代替 Tim
  • EJB 3.x 中 @Schedule 方法的动态参数

    我是 J2EE6 中 Schedule 注释的新手 我想使用 EJB 3 x 和 Glassfish 3 1 来运行作业 javax ejb Schedule 对我们来说似乎是一个不错的选择 因此我们可以将自定义时间视为如下所示 Singl
  • 评估复杂的时间模式

    我想定义和评估一些非常复杂的时间模式的出现 这些模式无法通过 CRON 表达式轻松处理 有没有图书馆可以帮助我做到这一点 例如 我希望它每 25 秒发生一次 我只想发生在每月的第一天和最后一天 但每月的第一天应该让我在上午 9 00 到 1
  • 如何安排python脚本在给定时间退出

    我需要安排一个 python 脚本 它可以在给定时间退出并自行终止 对于调度 我使用 pythonschedule下面是代码 import schedule from threading import Thread import time
  • 如何在 PHP 中获取给定日期范围内的每周特定日期?

    这给了我日期范围内的每个星期一的日期 问题 如何获取一周中的每个星期一和星期五 start date date Y m d end date date Y m d strtotime start date 1 MONTH for i str
  • 在android中创建一个定时服务

    我需要用java在android中创建一个日程服务 我尝试了一些代码 但在构建应用程序后它始终无法运行 我的逻辑很简单 我想创建一个服务来检查蓝牙文件夹路径中是否存在文件 如果该文件存在 那么该服务将运行另一个应用程序 我需要每 2 分钟运
  • 可以在 Twilio 中保存短信并安排发送吗?如果没有,我该如何完成这件事?

    我刚刚注册了 Twilio 试用帐户 我没有看到任何功能说明如何创建和保存多条短信供以后使用以及安排何时将它们发送到群组 这可能吗 或者有没有更好的软件可以做到这一点 Twilio 传道者在这里 查看您的个人资料 您的首选语言似乎是 PHP
  • 本地通知抖动

    谁能用代码向我展示如何使用本地通知插件在 flutter 中安排通知 尝试了 git 存储库中的示例 购买它对我不起作用 尽管正常通知正在工作 但我如何将其安排在特定时间 例如提醒 来自插件示例代码 https github com Mai
  • 使用 Schedule 库安排异步函数。 (使用discord.py重写)

    我的上一篇文章被错误地标记为重复 我不想做 asyncio sleep 因为它在几周内太不准确了 我需要时间表库 我发现了一个类似的线程 如何使用计划库运行异步函数 https stackoverflow com questions 515
  • 如何在 django 中安排将来某个时间发送电子邮件?

    我想安排在执行特定操作时向用户发送电子邮件 但是 如果用户采取其他操作 我想取消该电子邮件并且不发送它 我该如何在 django 或 python 中做到这一点 豆茎 如果可以安装的话豆茎 http kr github com beanst
  • Java Spring @Scheduled 任务执行两次

    我这里有一个简单的测试方法 设置为每 5 秒运行一次 并且确实如此 但是查看 System out 您可以看到它似乎在做一些奇怪的事情 Scheduled cron 5 public void testScheduledMethod Sys
  • 使用VB.net创建计划任务[重复]

    这个问题在这里已经有答案了 如何使用 VB NET 创建计划任务 单击按钮时从 vb net 程序填充计划任务字段 我现在什么都没有 也不知道是否可能 您必须围绕本机 COM 接口创建包装器 如果你不想自己做 你可以使用这个库https t
  • 将 Primefaces Jar 3.3 替换为 4.0 后,primefaces 计划事件颜色不起作用

    我使用 primefaces 4 0 并尝试更改 Primefaces Lazy Schedule 中事件的颜色 因此我有以下 xhtml 代码
  • 资源调度问题

    我正在开发一个摩托车租赁网站 我遇到的问题是如何高效地解决为客人分配摩托车的问题 我知道如何以 愚蠢 的方式做到这一点 但我想知道是否有一种经典算法可以解决此类问题 这与将客人分配到酒店房间是同样的问题 在最后一个示例中 目标是通过不因调度
  • 预订表中仅允许工作时间

    PostgreSql 9 2 保留表定义为 CREATE EXTENSION btree gist CREATE TABLE schedule id serial primary key during tsrange not null EX
  • 如何使用计划库运行异步函数?

    我正在使用discord py rewrite 编写一个discord 机器人 并且我想每天在特定时间运行一个函数 我对异步函数完全没有经验 而且我无法弄清楚如何在不使用 await 的情况下运行异步函数 这只是我的一段代码 这就是为什么有

随机推荐