Как пропустить некоторые ключи с помощью итератора?

В качестве примера, я добавил несколько ключей в БД, например,

<1 + 2> 
<1 + 3>
<2 + 1>
<2 + 4>
<3 + 2>

Первый, Seek() до <1, 2>, а затем Next() на <1, 3>После этого я хочу пропустить клавиши <2, 1> и <2, 4> (чей префикс все 2) и переместите итератор в <3, 2> без нового seek операция. Использование нового Seek() операция неожиданная из-за этого Seek() дорогой. Какой метод я должен использовать?

Этот подход пропуска сканирования похож на этот

Я предпочитаю программировать как следующие строки:

DBIter* it = NewDBIterator(...);
set = {key1, key2, key3, ...};
Iterator key_iter = set.begin();
for (it->SeekToFirst(); it->Valid() && key_iter != set.end(); it->SkipToNext(*key_iter), ++ key_iter) {
  // do something
}

1 ответ

Как описано в посте, вы связываете работу с пропуском сканирования, просматривая префикс ключа в предположении, что ключи хранятся в порядке. Если вы ищете какое-либо значение второй ключевой части меньше 3 в:

1,2
1,3
1,4
2,1
2,2
2,3
...

когда вы достигнете 1,3, вы узнаете, что больше не будет ключей, соответствующих вашему предикату с ключевым префиксом 1, поэтому вы можете перейти к следующему ключевому префиксу. Как правило, это все еще означает, что вы должны смотреть по крайней мере на каждый префикс ключа на пути к поиску следующего префикса или искать его каким-то образом. Хорошо это или нет, зависит. Для операции с определенным набором ключей отдельный поиск почти наверняка является лучшим вариантом, потому что, если вы не очень хорошо знаете, как выглядят ваши данные, вы не знаете, сколько ключей вам нужно сканировать с префиксом, и вы можете иметь смотреть на каждый из них (O(n)), где при поиске k требуется только O(k) * O(log(n)) время. Так что, пока k << n, определенно сделайте поиск. Оптимизация, о которой вы говорите, применима к предикатам на ключах, для которых вам в противном случае придется оценивать предикат для каждого ключа в таблице. Следовательно, пропуск ключей является оптимизацией в этом случае, потому что вы должны оценивать предикат реже и обходиться без дешевого сравнения предикатов.

Другие вопросы по тегам