Ответ 1
Существует несколько решений, некоторые из которых могут оказаться вам немыслимыми, но, возможно, один из них будет придерживаться:
- Сделайте окантовку по диапазонам ввода для этого значения (например, осколок 1 содержит A-C, осколок 2 D-F и т.д.). В качестве альтернативы используйте другую таблицу с внешними ключами в эту таблицу в качестве индекса и обведите индексную таблицу с помощью этой системы. Таким образом, вы можете легко найти и получить заданные диапазоны. Это решение, вероятно, является лучшим с точки зрения производительности, если вы можете это сделать (он предполагает, что количество осколков статично и осколки надежны).
- Определите элементы страницы путем двоичного поиска. Например, скажем, что вам нужны позиции от 100 до 110. Для каждого осколка подсчитайте количество значений лексикографически ниже "М". Если сумма чисел выше 100, уменьшите опорную точку, в противном случае увеличьте ее (используя двоичный поиск). После того, как вы идентифицируете 100-й элемент (первый элемент на своей странице), возьмите 9 верхних 9 (10 - 1) предметов, превышающих этот предмет, из каждого осколка, выберете их, отсортируйте весь список, возьмите верхнюю 9 из списка, добавьте первый элемент и там ваша страница! Этот подход сложнее реализовать и потребует
O(log(n))
запросов, поэтому он медленнее, чем (1), но все же может быть достаточно быстрым, если нагрузка не очень тяжелая. - Сохраните номер страницы с каждым значением. Это дало бы вам невероятно быстрое чтение, но ужасно медленно пишет, поэтому оно работает только в сценарии, где очень мало записей (или только добавляется в терминах упорядоченной переменной).