除了這個問題Find number range intersection我想獲得2個時間範圍的交集範圍。所以我的問題是獲取號碼範圍交集
什麼是有效的數學/算法的方式來獲得兩個數字範圍的交集的時間範圍?
除了這個問題Find number range intersection我想獲得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:最簡併的範圍不斷
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
這個僞-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位尋址),但你必須要考慮便於攜帶和下溢減去各天,分鐘的時候,等
如果有人需要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;
}
你想要的路口或工會? – 2011-03-22 12:50:42
十字路口對不起(編輯後) – 2011-03-22 12:58:09