Разбивка на страницы в отсортированном списке объектов из разных источников

#algorithm #list #api #sorting #pagination

#алгоритм #Список #API #сортировка #разбивка на страницы

Вопрос:

Моя проблема в том, что у меня есть два списка для, для простоты с 4-4 элементами, это не уникальные элементы. Элементы, отсортированные по вычисленному значению, назовем это рангом. Теперь я должен отображать 2 элемента на странице из 8 элементов, но только уникальные значения, упорядоченные по рейтингу.

Итак, у меня есть эти два списка:

Список A

 A - 1
B - 2
D - 5
C - 6
  

Список B

 A - 2
D - 3
B - 4
C - 5
  

Итак, мне нужна первая страница элементов, упорядоченных по ранжированию со смещением 0 предел 2, и это было бы:

Первая страница

 A(list A) - 1
B(list A) - 2 // we skip the A from list B because we need unique values
  

таким образом, ожидается, что вторая страница будет:

Ожидаемая 2-я страница

 D(list B) - 3
C(list B) - 5
  

но фактическая вторая страница из-за смещения (пропускает первые два элемента в каждом списке) приведет к:

Фактическая 2-я страница

 B(list B) - 4
D(list A) - 5 // or C - 5 from list B
  

значения будут дублироваться (B), что, очевидно, плохо.

Теперь единственное решение, которое я могу придумать, это объединить все списки в один упорядоченный список и применить разбивку на страницы в этом списке, но это то, что я не могу сделать. Я получаю доступ к этим спискам через API, и даже если это собственный API, я должен думать об этом как о стороннем API, который нельзя изменить. API принимает только параметры направления сортировки (asc, desc), смещения и ограничения.

Я должен отображать эти значения в режиме реального времени, если что-то изменилось в списках, я должен показать эти изменения.

Любой совет?

Комментарии:

1. Не могли бы вы предоставить соответствующие части API?

2. Это веб-приложение?

3. Да, это веб-приложение. Что бы вы хотели увидеть в API? Интерфейс довольно прост, /list/:listid/offset/:offset/limit/:limit/sort/:sort , это все, с чем я могу поиграть. Он возвращает массив в формате json с элементами. @Tarik

4. Обязательно ли получать все элементы за один раз в структуре JSON? Если да, то насколько он велик?

5. Я могу получить списки по частям. В настоящее время списки не слишком большие, всего 1-2 тыс. элементов в списке, но они могут расти до «бесконечности».

Ответ №1:

У меня есть одна идея. Пожалуйста, просмотрите его.

Сделано предположение: оба списка имеют одинаковые записи.

Вот пример кода, который решит вашу проблему:

 node * H_A = List_A.head
node * H_B = List_B.head

while ((H_A == NULL) || (H_B == NULL))
{
    // Here I am maintaining an invariant that value pointed by H_B is
    // greater than the value pointed by H_A.
    if (H_B > H_A)
    {
        swap (H_B, H_A);
    }

    Display value of H_A on the current page. This is the first value of the page.

    Move H_A to next value.

    if (value.H_B > value.H_A)
    {
        Display value of H_A on the current page. This is the second value of the page.
    }
    else
    {
        Display value of H_B on the current page. This is the second value of the page.
    }

    Move H_A to next value.
    Move H_B by two values.
    Move to next page. This page is completed.
}
  

Пожалуйста, дайте мне знать, если это не решит вашу проблему. Мы будем работать над этим.