Сравнение векторных часов для корреляции событий
У меня есть куча файлов журналов, состоящих из журналов событий, а также их векторные часы. Теперь, сравнивая векторные часы любых двух событий, было бы правильно взять корень из суммы квадратов каждого компонента векторных часов и использовать результат для сравнения с результатами другого, а затем сделать вывод, что меньшее значение предшествует другому?
1 ответ
Решение
Нет, если бы был способ уменьшить его до одного значения, мы бы использовали это вместо вектора!
Чтобы сравнить векторные часы, нужно по частям сравнить весь вектор.
class VectorClock {
private long[] clocks;
...
/**
* This is before other iff both conditions are met:
* - each process's clock is less-than-or-equal-to its own clock in other; and
* - there is at least one process's clock which is strictly less-than its
* own clock in other
*/
public boolean isBefore(VectorClock other) {
boolean isBefore = false;
for (int i = 0; i < clocks.length; i++) {
int cmp = Long.compare(clocks[i], other.clocks[i]);
if (cmp > 0)
return false; // note, could return false even if isBefore is true
else if (cmp < 0)
isBefore = true;
}
return isBefore;
}
}
Вы можете сделать менее точный проход, используя только min и max:
class VectorClockSummary {
private long min, max;
...
public tribool isBefore(VectorClockSummary other) {
if (max < other.min)
return true;
else if (min > other.max)
return false;
else
return maybe;
}
}