在 2 列表中插入非重叠范围

Posted

技术标签:

【中文标题】在 2 列表中插入非重叠范围【英文标题】:insert non-overlapping range in 2 column table 【发布时间】:2014-01-17 11:07:24 【问题描述】:

我有一个包含 2 列的数据库表。

+-------+-------+
|min    |max    |
+-------+-------+
|0      |99,999 |
+-------+-------+
|100000 |499999 |
+-------+-------+
|1000000|9999999|
+-------+-------+

我需要实现一个逻辑,它只允许输入不重叠的range(min,max)。例如,不应允许 5,500000,但应允许 500000,900000。

该逻辑可以在JAVASQLJS中实现。

【问题讨论】:

而你尝试...什么也没有?有吗? "I need to implement a logic" - 你说得真好!但是有什么问题吗,或者你只是在寻找一个天真的工人来做呢? 附带说明,max 应存储为独占值 - 即第一行应为 0 | 100,000,第二行应为 100,000 | 500,000,等等。尤其是当您查询任何内容时这不是整数计数,这使得范围查询安全(而不是丢失随机值)。如果您只有现有的连续范围(并且由具有某些功能的数据库支持),这实际上允许派生 【参考方案1】:

最简单的例子:http://jsfiddle.net/6QFRV/1/

function isAllowed(number)

    var ranges = [
        min: 0, max: 100,
        min: 150, max: 250,
        min: 251, max: 300
    ];

    for (key in ranges)
    
        var range = ranges[key];
        if (number >= range.min && number <= range.max)
            return true;
    

    return false;


alert(isAllowed(10)); //true
alert(isAllowed(101)); //false
alert(isAllowed(299)); //true

【讨论】:

我不认为这是解决方案。他在谈论输入范围。【参考方案2】:

正如已经指出的那样,问题在于范围,而不是检测单点包含。然而,这只是一个详细说明,因为 range(min,max) 当且仅当不包括 min 和 max 时才应该返回 true - 您只需测试两个点,或者如果数据库端点中的 a 范围之一是包含在范围内(min.max)。也没有必要遍历所有内容。您应该能够使用数据库功能快速找到终点。假设在 min 和 max 列上有索引,那么算法的顺序将是 O(log N),其中 N 是数据库中的行数,而不是 O(N) 如果您搜索每一行。

假设 range(min,max) 产生 2 个变量 range_min 和 range_max,我认为你可以这样做

select count(*) from min_max_table mmt where
   range_min > mmt.min and range_min < mmt.max or
   range_max > mmt.min and range_max < mmt.max or
   mmt.min > range_min and mmt.min < range_max or
   mmt.max > range_min and mmt.max < range_max
   limit 1;

如果此选择的结果为 0,则允许为真,否则为假。

【讨论】:

以上是关于在 2 列表中插入非重叠范围的主要内容,如果未能解决你的问题,请参考以下文章

区间树中的最大非重叠区间

给定 2 个整数列表如何找到不重叠的范围?

查找两个整数范围之间的重叠区域

Leetcode练习(Python):数组类:第57题:给出一个无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合

2022-10-07:给定员工的 schedule 列表,表示每个员工的工作时间。 每个员工都有一个非重叠的时间段 Intervals 列表,这些时间段已经排好序。 返回表示 所有 员工的 共同,正

Postgres 9.x 在重叠日期和时间范围内加入