@Pallid

Алгоритм получения n количества записей отличных от уже полученный, как?

Есть таблица с записями допустим там хранятся картинки, при открытии страницы необходимо получить n картинок из нее, при нажатии на кнопку "еще", получить еще n картинок, отличных от уже полученых

Заранее спасибо!
  • Вопрос задан
  • 2311 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Eddy_Em
Вариант 1: для N объектов создаем массив из N байт, где каждому i соответствует 0/1. 0 - если объект уже использовался, 1 - если еще не использовался. Затем при помощи ГСЧ набираем нужное количество объектов. Минусы: чем меньше объектов, тем дольше мы их будем извлекать.
Вариант 2: заводим связный список. Соответственно, для выбора i-го элемента нам придется пройти i-1 предшествующий. Зато не надо дергаться, когда остается мало элементов, т.к. уже использованные извлекаются из списка. Минусы: необходимость проходить по списку для извлечения объекта.
Вариант 3: связный список + массив. Перед процедурой выбора мы пробегаемся по всему списку и заполняем масссив ссылок. Далее — обычная процедура выбора из массива по индексу с удалением соответствующего элемента из списка. Минусы: каждый раз перед использованием нужно перестраивать массив.
Вариант 4: использовать дерево. Минусы: периодически придется перебалансировать его.

Я рекомендую вариант 3: вроде бы, из предложенных он самый шустрый.

P.S. В жабоскриптике возможен еще вариант: индексы элементов сразу загнать в массив, а как только мы используем какой-то индекс, удалять его из массива. Фактически это вариант 3 с немного меньшим потреблением памяти.
Ответ написан
Комментировать
@MiiNiPaa
В зависимости от количества картинок:
1) Если картинок не очень много, сохраните ссылки на эти картинки/записи в таблице в отдельном контейнере. Дальше банально выбираете случайный элемент и удаляете его из контейнера n раз. Затем ещё n раз и так далее
2) Если картинок много
    а) Просто выбирайте случайно. Шансы на получение уже просмотренных картинок низок, шанс пользователя заметить это ещё ниже
    б) Проверяйте, не была ли показана ли картинка и перевыбирайте если была.
    в) Соберите статистику, сколько страниц в основном смотрит юзер. (например, 5) Затем разбейте множество всех картинок на 5 не пересекающихся подмножеств и каждую страницу генерируйте только из картинок специфического подмножества. Если юзер не успокаивается и уже просмотрел все множества, генерируйте совсем случайно (с повторами).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы