- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我发现了类似的问题,但没有考虑优先级。
R : (------------|xxxxxxx|ooo|xx|----------------) (---)
S1: (------------) (----------------) (---)
S2: (xxxxxxxxxxxxxxx) (xxxxxx)
S3: (ooooooo) (oo)
假设我有 3 个日期范围来源,名称为 S1、S2 和 S3,优先级分别为 1,2 和 3(1 为最高)和结果 R。我需要结果是不重叠的日期范围最高优先级优先。
我想到了一个解决方案,但它很顺序。首先,我创建了一个按日期升序、优先级降序排列的表(如果发生日期冲突,最高优先级在表中排在第一位)及其 ID 和操作(开放或关闭范围):
ID | Action | Priority | Date |
--------------------------------
S1a | Open | 1 | 1 |
S2a | Open | 2 | 2 |
S1a | Close | 1 | 3 |
S3a | Open | 3 | 4 |
S2a | Close | 2 | 5 |
S2b | Open | 2 | 6 |
S3a | Close | 3 | 7 |
S1b | Open | 1 | 8 |
S2b | Close | 2 | 9 |
S3b | Open | 3 | 10 |
S3b | Close | 3 | 11 |
S1b | Close | 1 | 12 |
S1c...
然后我开始迭代这个表并填充一个有序列表和一个结果表:
所以第一行是:
Order List: Result:
ID | Priority | ID | Action | Date |
S1a| 1 | S1a| Open | 1 |
第二行,添加了 S2a 的开始日期,但没有写任何东西,因为表中存在更高的优先级:
Order List: Result:
ID | Priority | ID | Action | Date |
S1a| 1 | S1a| Open | 1 |
S2a| 2 |
第三行,关闭 S1a,写入关闭日期,由于 S2a 移至列表顶部,它也写入 S2a 的打开日期。
Order List: Result:
ID | Priority | ID | Action | Date |
x S1a| 1 | S1a| Open | 1 |
S2a| 2 | S1a| Close | 3 |
S2a| Open | 3 |
我猜你能看出这是怎么回事……大量的交叉检查等,但在纸上它似乎有效。如果有人需要,我可以更好地解释算法,但我认为它并不难理解。如果有序列表中有更高的优先级,则不写入任何内容。当更高的优先级被移除时,下一个最大的将再次打开。
也许有人有更好、更具体的想法?
感谢您的宝贵时间!
最佳答案
解决这个问题的另一种方法是以相反的方式构建它,首先填充具有最低优先级的表,然后在用更高优先级的项目填充它时简单地覆盖日期。这样就不必创建订单列表并跟踪哪些项目已打开等待启动。
NOTE: I should say up front that the following algorithm is almost assuredly less efficient (I didn't do the math but intuition tells me it's less efficient). It's simply another way to approach the problem.
以这种方式将每个事件的开始和结束日期分组会更有益。为了简单起见,我将把开始日期到结束日期称为“事件”。因此,您首先添加每个优先级最低的事件。然后您开始查看按优先级排列的数据,然后按日期排列。像这样:
ID | Action | Priority | Date |
--------------------------------
S3a | Open | 3 | 4 |
S3a | Close | 3 | 7 |
S3b | Open | 3 | 10 |
S3b | Close | 3 | 11 |
S2a | Open | 2 | 2 |
S2a | Close | 2 | 5 |
S2b | Open | 2 | 6 |
S2b | Close | 2 | 9 |
S1a | Open | 1 | 1 |
S1a | Close | 1 | 3 |
S1b | Open | 1 | 8 |
S1b | Close | 1 | 12 |
-------------------------------
所以简单地遍历最低优先级并将所有内容添加到结果中:
结果:
ID | Action | Priority | Date |
--------------------------------
S3a | Open | 3 | 4 |
S3a | Close | 3 | 7 |
S3b | Open | 3 | 10 |
S3b | Close | 3 | 11 |
这是事情变得有趣的地方,现在您开始查看下一个最高优先级的事件。因此,我们遇到了第一个事件 S2a
,我们所做的是在结果中搜索位于 S2a Open
和 S2a Close
之间的日期。如果我们抽象地思考一下,我们会得到 3 种不同的情况:
在第一种情况下,由于事件的开始将被推到更高优先级事件的结束。即设置包含的事件开始于当前更高优先级事件的 Close
。
在第二种情况下,由于事件的结束发生在优先级较高的事件开始之后,因此它必须提前结束。所以我们将包含的事件的结束设置为当前更高优先级事件的 Open
。
在最后一种情况下,整个事件都包含在优先级较高的事件中,因此将被完全取消。即删除开头和结尾。
因此,如果我们查看您的示例,我们有 S2a Open
= 2 和 S2a Close
= 5。该范围内包含的唯一日期是 S3a Open
。因此,我们将 S3a Open
的日期更改为 S2a Close
的值,即 5。现在我们的结果如下所示:
结果:
ID | Action | Priority | Date |
--------------------------------
S2a | Open | 2 | 2 |
S2a | Close | 2 | 5 |
S3a | Open | 3 | 5 |
S3a | Close | 3 | 7 |
S3b | Open | 3 | 10 |
S3b | Close | 3 | 11 |
由此不难推断出其余部分是如何落实到位的。 (尽管如果您想要更多解释,请告诉我。)
根据信息的组织方式和涉及的数据结构,这可能不如您描述的方式有效。但我认为这个更直观一点,因为您首先安排最低优先级,然后修改它们以便为更高优先级腾出时间。我看不出您提供的解决方案有问题,它确实保证您只查看每个条目一次(而我的可以多次查看该项目,或修改最终被后来的事件破坏的项目)。
我不推荐我的解决方案胜过您的解决方案,但您并没有要求效率,只是以不同的方式看待它。
关于algorithm - 优先处理重叠的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19144612/
我的数据库中有两张表,一张用于 field ,另一张用于预订。我需要的是一个查询来选择所有未预订的 field 。见下文: 餐 table 预订具有以下字段: bk_id venue_id 作为(预订
嗨,我是编码新手,我有一些培训项目,其中包括从 HTML 表单输入 MySQL 数据库。它就像你玩过的游戏的日志。第一个日期输入是您开始游戏的时间,第二个日期输入是您完成游戏的时间。但我需要检查器或类
我是这个 sql 编码的新手,我正在尝试学习新的东西。因此,我创建了一个交货表,其中包含一些属性,如商品代码、交货日期、交货数量。所以如何从同一张表中获取第一个交货日期(最小日期)和交货数量以及最晚交
我从支付网关返回了这个日期 2014-05-15T08:40:52+01:00 我得到 2014-05-15T08:40:52 但我无法识别时区 +01:00 的含义 我的位置时区是 UTC−06:0
我快要疯了,请帮忙。 我有一列包含日期时间值。 我需要找到每天的最小值和最大值。 数据看起来像这样 2012-11-23 05:49:26.000 2012-11-23 07:55:43.000
我从 json 数据中获取日期为 2015 年 4 月 15 日晚上 10:15我只想在 html 页面中显示 json 响应数据的时间,例如 10:15 PM这里我放了我的js函数和html代码 J
是否有 javascript 库或其他机制允许我将 .NET 日期/时间格式字符串(即 yyyy-MM-dd HH:mm:ss)传递给 javascript函数并让它相应地解析提供的日期时间值?我一直
我正在使用以下代码以正确的格式获取当前的 UTC 时间,但客户返回并要求时间戳现在使用 EST 而不是 UTC。我搜索了 Google 和 stackoverflow,但找不到适用于我现有代码的答案。
我有以下日期的平均温度数据。我想找到连续至少 5 天低于或高于 0 摄氏度的开始日期。 date_short mean.temp 1 2018-05-18 17.54 2 2018-05-19
它可以在其他网络浏览器中使用,但 IE11 返回无效日期。 为了调试我使用了下面的代码。 console.log('before - ' + date.value); date.value = new
我在 Excel 中有一个数据的 Web 提取,其中日期列带有/Date(1388624400000)/。我需要在 Excel 中将其转换为日期。 最佳答案 能够从 here 中推断出它. 假设字符串
嗨,我的 Schmema 有一个带有 ISO 日期的字段: ISODate("2015-04-30T14:47:46.501Z") Paypal 在成功付款后以该形式返回日期对象: Time/Date
我的 table : CREATE TABLE `tbdata` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `PatientID` INT(10) NOT
我正在 Ubuntu 服务器 12.04 中编写一个 shell 脚本,它应该比较日志文件中的一些数据。在日志文件中,日期以以下格式给出: [Mon Apr 08 15:02:54 2013] 如您所
我想使用 GROUP BY WITH ROLLUP 创建一个表并获取总行数而不是 null。 $sql ="SELECT IF(YEAR(transaktioner.datum
我正在创建博客文章,在成功迁移我的博客文件后,当我转到我网站的博客页面时返回一个错误(无法解析其余部分:':“Ymd”'来自'post.date|date: "Ymd"') 我似乎无法确定这是语法错误
我正在尝试获取要插入到 CAML 查询中的月份范围,即:2010-09-01 和 2010-09-30。 我使用以下代码生成这两个值: var month = "10/2010"; var month
如何将代码document.write("直到指定日期")更改为writeMessage(date)中的日期?此外,writeMessage(date) 中的日期未正确显示(仅显示年份)。感谢您帮助解
我在 Windows (XP) 和 Linux 上都尝试过 utime()。在 Windows 上我得到一个 EACCES 错误,在 Linux 上我没有得到任何错误(但时间没有改变)。我的 utim
我正在尝试计算发生在同一日期的值的总和(在 XYZmin 中)。 我的数据看起来像这样, bar <- structure(list(date = structure(c(15622, 15622,
我是一名优秀的程序员,十分优秀!