2011-03-22 93 views
1

除了這個問題Find number range intersection我想獲得2個時間範圍的交集範圍。所以我的問題是獲取號碼範圍交集

什麼是有效的數學/算法的方式來獲得兩個數字範圍的交集的時間範圍?

+0

你想要的路口或工會? – 2011-03-22 12:50:42

+0

十字路口對不起(編輯後) – 2011-03-22 12:58:09

回答

2
public BTraceStatsTimeRange getOverlap(BTraceStatsTimeRange other) { 
    if (!intersect(other)) { 
     return NULL; 
    } 
    long startOther = other.start; 
    long endOther = other.end; 
    long minEnd = Math.min(end, endOther); 
    long maxStart = Math.max(start, startOther); 
    return new BTraceStatsTimeRange(Math.min(minEnd, maxStart), Math.max(
      minEnd, maxStart)); 
} 

今天我累了.... ;-)

0

從第二範圍的每個端點減去第一範圍的每個端點。如果您有:

  • 所有的陽性或陰性結果:範圍是不相交的
  • 一個非負或從負的結果:該路口是這個結果
  • 兩個非陰性結果的操作數:範圍在這兩種計算非共同操作
  • 所有結果都是0:最簡併的範圍不斷

    vectors = (
        ((1, 3), (2, 4), '2-3'), 
        ((1, 4), (2, 3), '2-3'), 
        ((1, 2), (3, 4), 'Disjoint'), 
        ((2, 4), (1, 3), '2-3'), 
        ((2, 3), (1, 4), '2-3'), 
        ((3, 4), (1, 2), 'Disjoint'), 
    ) 
    
    for a, b, c in vectors: 
        print c, a, b 
        for x in a: 
        for y in b: 
         print x, y, x-y 
    
2

這個僞-C應該做的伎倆:

R_TYPE Intersection(P_TYPE start1, P_TYPE start2, P_TYPE end1, P_TYPE end2) 
{ 

    if(max(start1, start2) <= min(end1, end2)) 
    { 
     return(min(end1, end2) - max(start1, start2)); 
    } 

    return(DISJOINT); 
} 

R_TYPE是你的 '自定義' 返回類型,P_TYPE是您的'自定義'參數類型。你可以將其設置爲任何有效的標籤號碼類型(整數,浮點等)使用#define DISJOINT ...DISJOINT設置爲某個值,通常會超出範圍(-1或MAX_INT等)

如果你有一些自定義DATE_TIME_TYPE,你必須改變這個以適應這個。舉例來說,如果你定義諸如結構:

typedef union 
{ 
    unsigned char date_time[7]; 
    struct 
    { 
     unsigned char second; 
     unsigned char minute; 
     unsigned char hour; 
     unsigned char day; 
     unsigned char month; 
     unsigned int year; 
    } 
}DATE_TIME_TYPE; 

您可能仍然能夠通過做值之間的直接比較,以獲得(假設小尾數和8位尋址),但你必須要考慮便於攜帶和下溢減去各天,分鐘的時候,等

0

如果有人需要JavaScript版本是在這裏:

function findRangeIntersection(a1, a2, b1, b2) { 
    if (Math.max(a1, b1) <= Math.min(b2, a2)) { 
     return Math.min(a2, b2) - Math.max(a1, b1); 
    } 
    return Number.NaN; 
}