【问题标题】:What data structure can we use to efficiently check for resource availability?我们可以使用什么数据结构来有效地检查资源可用性?
【发布时间】:2017-06-05 23:32:51
【问题描述】:

这个问题是reddit用户/u/Dasharg95asked on behalf

我想建立一个酒店房间预订系统,每个酒店房间都可以在任意时间范围内预订。针对预订数据集的常见查询是试图找出在给定时间范围内有哪些房间可用。预订数据集是否有可以有效执行此类查询的数据结构?

例如,假设我们有五个房间,占用时间如下:

room 1:  9:00 -- 12:00, 15:00 -- 18:00, 19:30 -- 20:00
room 2:  8:00 --  9:30, 15:30 -- 17:30, 18:00 -- 20:00
room 3:  6:30 --  7:00,  7:30 --  8:15
room 4: 12:00 -- 20:00,
room 5:  7:00 -- 14:15, 18:00 -- 21:55

我想要一个占用时间的数据结构,该结构具有合理的空间效率,并允许以合理的性能执行以下查询:

  • 给定房间的占用时间
  • 在给定时间范围内哪些房间是免费的

【问题讨论】:

  • 你不需要一个单纯的数据结构,你需要一个规范化的关系数据库。太宽泛了。
  • @EJP 我不确定关系数据库如何解决这个问题。你能写一个答案,解释我可以在哪些关系上运行哪些查询来解决这个问题?
  • 这个问题的答案在很大程度上取决于房间数量、时间范围的粒度以及可用的插槽总数。如果我们在一天内谈论几十个房间,粒度为 15 分钟,那么幼稚的方式就足够了。如果您说的是酒店的数千间客房,您可以提前数年预订多天,那就完全不同了。
  • @JimMischel 我说的是后一种情况。我对理论上的解决方案感兴趣,而不是“在实践中足够好”的解决方案。
  • 那么关系数据库就是解决方案。这不仅仅是一个简单的“这里是代码”。这是一个相当复杂的系统。

标签: data-structures language-agnostic


【解决方案1】:

想象一下,如果您希望以 15 分钟为间隔进行一次,那么您将有 24×4 = 92 个不同的间隔,第一个从 0:00 到 0:15。将其放入二进制文件中并添加一些信息,以检查您是否选择了正确的房间,您可以使用 100 位。现在您创建函数来创建位串并解密字符串并将字符串存储在数组中。完成。

【讨论】:

  • 请注意,这只是一个示例。在现实世界的应用程序中,需要很长的时间来保存(10 年左右)、更精细的粒度和更多的空间。
【解决方案2】:

2D 阵列系统在没有大量资源使用的情况下仍然很有用。房间号可以等同于索引——例如,索引 i 是房间号:

String [] = {"taken","not","taken","not","taken"}

索引是元素的位置

第二个元素“not”是 1 的索引,因为第一个元素(项目)是 0 的索引。要获得房间号,将索引加上 1,就好像酒店只有一个房间,它会是“Room 1”而不是“Room 0”。所以索引 + 1 保存了数字。

如果您分配相同大小的时间(xxxx.yyyy,其中 xxxx 是打开时间,yyyy 是关闭时间),那么您可以通过使用子字符串来截取元素的一半以获取前四个/后四个字符暂时,通过在 xxxx 中间放一个冒号来打印出来,比如 xx:xx。

它可以存储在一个简单的一维数组中,如下所示:

String [] rooms = {"0900.1200", "1500.1800", "1930.2000")

......编辑,刚刚意识到那些时间将是一个房间x(......

因此,要为一个房间分配多次,您可能需要使用格式化系统 - 例如:

// * = the next four digits are the opening time
// - = the next four digits are the closing time

因此您可以在一个元素中多次保存,例如:`{"*0800-0930*1530-1730*1800*2000", ....}

它非常复杂,但这仅使用一个数组,并且计算机可以使用while循环来检查关闭时间之后是否还有更多次-> 如果没有,则移动到下一个元素/一组时间,和房间号/索引。

循环遍历所有元素后,房间检查就完成了。

【讨论】:

  • 这对于很多实际案例来说是一个很好的解决方案。然而,它的问题是它需要量化占用时间,这可能并不容易。此外,还需要相当大的空间。您是否知道是否有更好的解决方案?
  • @fuz 链表/动态集合可能是一个想法 - 它只使用所需的相同数量的内存,与具有永久大小的数组不同,它会根据数据量进行相应调整。它是最有效的数据结构。
  • 通过您的编辑,我不确定这个数据结构有什么用处。你能说明如何检查给定时间范围内哪些房间可用吗?请注意,在该时间范围内可能只有少量房间可用,因此不需要遍历所有房间的解决方案可能很有用。此外,一个房间被占用的时间列表可能会变得非常大,每次检查都要检查整个占用列表听起来有点慢。
  • 查看我更新的问题以了解我需要哪些属性。
  • 想象一下,阵列中每个房间的预订时间为 10 年。您认为需要多长时间才能查明今天上午 8:00 到 12:00 间是否有空房间?我必须阅读几乎整个数据库才能找到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
相关资源
最近更新 更多