python算法:如何有效地找到两个整数集是否相交?

时间:2011-01-10 11:01:00

标签: python algorithm data-structures mongodb

给定一组[2004,2008],找到这个集合是否与其他集合相交的最快方法是什么?

其实我在处理数据库的问题,表有2列,一列是下限,另一列是上限。任务是找到具有给定2元组的所有相交行(如[2004,2008])。

我正在使用mongodb,这本质上是支持的(我的意思是有关键字来做)。 我有庞大的用户群,所以我希望尽快完成这项任务。

编辑:为了更清楚,数据库表包含以下行:

20 30
10 50
60 90
...

给定输入(25 40)范围,我想返回表示范围的行,与给定范围相交。

所以返回是:(20 30),(10 50)

5 个答案:

答案 0 :(得分:4)

我根本不知道MongoDB,但你基本上都在寻找

SELECT * from the_table where not (lower_bound > 2008 or upper_bound < 2004)

答案 1 :(得分:3)

尝试此操作,假设lowhigh是您的绑定字段:

db.ranges.find({'low': {'$lt': self.high}, 'high': {'$gt': self.low}})

如果您希望查询具有包容性而非排他性,则替换$lte$gte

答案 2 :(得分:2)

MongoDB不支持交集。使用集合的intersection()API在Python级别执行交集。

答案 3 :(得分:1)

由于你正在处理下界和上界,你可以检查边界。

def intersects(this, others):
    upper, lower = this
    return [[u, l] for u, l in others 
            if (l < upper < u) or (l < lower < u)]

我不知道MongoDB,但如果你能在数据库中实现这个逻辑,我不禁会认为它会更快。

答案 4 :(得分:1)

您可以使用带有Javascript表达式的mongodb查询(假设lowerboundsupperbounds是相交的集合的限制):

f = function() { return this.lower <= upperbounds && this.upper >= lowerbounds; }
db.ranges.find(f);

这应该处理所有情况,包括[this.lower,this.upper]是[lowerbounad,upperbounds]的超集或适当子集时。