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

时间:2014-01-17 11:07:25

标签: java javascript sql algorithm

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

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

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

逻辑可以在JAVASQLJS中实施。

2 个答案:

答案 0 :(得分:0)

最简单的例子: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

答案 1 :(得分:0)

正如已经指出的那样,问题是范围,而不是检测单点包含。然而,它只是详细说明因为范围(min,max)应该返回true,当且仅当min和max都不包括在内时 - 你只需要测试两个点或交替地测试数据库端点中的一个范围是包含在范围(min.max)内。它也没有必要循环所有东西。您应该能够使用数据库功能快速查找端点。假设min和max列上有索引,则算法的顺序为O(log N),其中N是数据库中的行数,而不是O(N),如果搜索每一行。

假设范围(最小值,最大值)导致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,则允许为真,否则为假。