Пользовательский алгоритм подкачки для расчета страниц для отображения - PullRequest
3 голосов
/ 26 февраля 2010

Я работаю над пользовательским пейджером данных для пользовательского элемента управления Google Maps. Элемент управления должен определить, какой диапазон страниц отображать. Например, если пользователь находится на странице 6, то элемент управления должен отображать страницы с 1 по 10. Если пользователь находится на странице 37, то элемент управления должен отображать страницы с 30 по 40.

Доступные мне переменные:

X - Всего результатов (точки на карте)
Y - Текущий размер страницы. то есть количество баллов за страницу.
Z - отображается текущая страница
Q - Количество отображаемых номеров страниц (константа 10)

Я придумал:

Начальный индекс = Z - ( Z % Q )
Индекс окончания = Z - ( Z % Q ) + Q

Это, однако, не работает, когда текущая страница меньше 10. Она также не определяет, достигнута ли максимальная страница, т.е. мы всегда отображаем полный диапазон 10. Однако, если мы отображать диапазон 30-40, последняя страница может фактически быть 38.

Если кто-нибудь может придумать более элегантный алгоритм, он будет признателен.

Ответы [ 2 ]

9 голосов
/ 26 февраля 2010

Это может быть проще, если вы думаете с точки зрения глав.

Скажем, каждый набор страниц является главой, главы нумеруются с 0, 1, 2, ...

Тогда в первой главе есть страницы в диапазоне

Q r + 1 <= страница <= Q </em> (r + 1)

Теперь рассмотрим слово (page / Q). Это r, если страница не кратна Q, в противном случае это r + 1.

При заданном значении r вы можете найти страницы главы как Lower = Q r + 1 и выше = min (max, Q (r + 1)).

Так что вы можете сделать это.

if (Z < 1 || Z > max_page) { error;}

if (Z % Q == 0) {
    r = Z/Q - 1; // integer division, gives floor.
}
else {
    r = Z/Q; // floor.
}

Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);

Чтобы избавиться от if, теперь вы можете заменить его на

if (Z < 1 || Z > max_page) { error;}

r = (Z-1)/Q;
Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);

Это работает, потому что:

Q r + 1 <= Z <= Q </em> (r + 1) тогда и только тогда, когда

Q r <= Z-1 <= Q </em> r + (Q-1).

При этом этаж ((Z-1) / Q) = г.

4 голосов
/ 26 февраля 2010

Вот и мы:

def lower(Z):
  return (Z - 1) // Q * Q + 1

def upper(Z):
  return min(int(ceil(X / Y)), ((Z - 1) // Q + 1) * Q)

// - целочисленное деление.

...