#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.
}
Пожалуйста, дайте мне знать, если это не решит вашу проблему. Мы будем работать над этим.