Создание разбивки на страницы из нескольких источников

Мне нужно создать таблицу HTML с разбиением на страницы. Данные поступают из двух разных источников (могут быть 2 таблицы из двух разных баз данных, таких как один Oracle, а другой - MySQL), которые вы не можете использовать объединенный оператор select. Чтобы сделать его более сложным, мне нужно отобразить данные, отсортированные по метке времени (одно из свойств - метка времени) в порядке возрастания.

Например, источник A имеет 45 записей, источник B имеет 55 записей. Таким образом, таблица отобразит общее количество записей 100, но отобразит только 15 записей за раз. Таким образом, должно быть 7 страниц (6 страниц с 15 записями и 1 страница с 10 записями).

В приведенном выше примере всего всего 100 записей, которые могут быть легкими для того, чтобы память загружала их все. Но на самом деле это могут быть тысячи или миллионы записей. Кто-нибудь знает какой-нибудь алгоритм, который я могу использовать? Параметры, которые я могу предоставить, - это номер страницы и количество записей на странице.

Ответ 1

Как я понимаю, ваша забота - это память.

Если отдельные таблицы (A и B) не сортируются по метке времени, вам необходимо объединить все свои записи в один файл, а затем использовать некоторый алгоритм сортировки на основе файлов (что-то вроде MergeSort, за один проход вы получите отсортированные пары записей, во 2-м проходе вы сортируете 4 и т.д.). Когда у вас есть файл со всеми записями в порядке возрастания временных меток, вы можете разбить его на страницы.

Если таблицы уже отсортированы, то вам нужно объединить N отсортированных последовательностей в один. Я предлагаю вам организовать какой-то Heap, чтобы отслеживать, какой из N источников имеет элемент с мельчайший временная метка. В псевдокоде это будет выглядеть так:

for i=1,N
{
  Add the 1st record from each table to the Heap
}
while(Heap not empty)
{
  x = take the smallest item from the heap, noting which table j this record belonged to
  Add x to output
  if (the j-th table is not completely processed)
  {
    take the next value from the j-th table and insert it into the heap
  }
}

Сложность - O (M * logN), где M - общее количество записей в таблицах, а N - количество таблиц. Вся эта куча вещей стоит только хлопот, если N достаточно велико (моя догадка ~ 100). В противном случае я бы пошел с линейным поиском и O (N * M).