在 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。
该逻辑可以在JAVA
、SQL
或JS
中实现。
【问题讨论】:
而你尝试...什么也没有?有吗?"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 列表中插入非重叠范围的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):数组类:第57题:给出一个无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合
2022-10-07:给定员工的 schedule 列表,表示每个员工的工作时间。 每个员工都有一个非重叠的时间段 Intervals 列表,这些时间段已经排好序。 返回表示 所有 员工的 共同,正