Временные метки - это числа. почему бы не распространенные операторы числового сравнения, такие как> и <? </p>
Если у вас много временных меток, проблема не отличается, если вы просто хотите отфильтровать ваш набор один раз . Это O (n), и любой другой метод будет длиннее.
С другой стороны, с огромным набором, из которого вы хотите извлечь множество различных диапазонов, было бы более эффективно сначала отсортировать элементы. Назовите номер поиска m, сложность прямой фильтрации будет O (m.n). При сортировке с последующим поиском это может быть O (n.log (n) + m.log (n)), что обычно намного лучше.
Подойдет любой метод сортировки O (n.log (n)), включая использование встроенного оператора сортировки (или b-дерева, как вы предложили). Основное различие между эффективными методами сортировки заключается в том, может ли ваша память хранить ваш полный набор или нет. Если у вас есть загрузочное место памяти, чтобы хранить в памяти и данные, и ключи (временные метки), вы можете хранить только временную метку и некоторый индекс для данных в памяти и реальных данных в другом месте (файл диска, база данных). Но если ваш набор данных действительно такой большой, наиболее эффективным решением, вероятно, было бы поместить все это в базу данных с отметкой времени и индексировать ее (привязка к базе данных очень проста с использованием perl).
Тогда у вас будет свой диапазон. Вы просто используете двудольный поиск для поиска индекса первого элемента, включенного в диапазон, и последнего, сложность будет O (log (n)) (если вы выполните линейный поиск, вся цель сортировки будет побеждена).
Ниже приведен пример использования sort и binary_search для массива временных меток, расширение использования некоторой структуры данных с временной меткой и содержимым оставлено в качестве упражнения.
use Search::Binary;
my @array = sort ((1, 2, 1, 1, 2, 3, 2, 2, 8, 3, 8, 3) x 100000);
my $nbelt = @array;
sub cmpfn
{
my ($h, $v, $i) = @_;
$i = $lasti + 1 unless $i;
$record = @array[$i||$lasti + 1];
$lasti = $i;
return ($v<=>$record, $i);
}
for (1..1){
$pos = binary_search(1, $nbelt, 2, \&cmpfn);
}
print "found at $pos\n";