Re[3]: свести задачу к мат.модели?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 10.02.17 15:47
Оценка:
Здравствуйте, dinama, Вы писали:

D>и с запросом придется то-же самое делать. и опять-же для каждого паросочетания атрибутов в запросе — множество, которое затем пересекать.

А не получается ли тут OLAP какого-нибудь?
Sic luceat lux!
Re: свести задачу к мат.модели?
От: WolfHound  
Дата: 11.02.17 18:05
Оценка:
Здравствуйте, dunamo, Вы писали:

D>Есть множество элементов. Элементы имеют набор атрибутов. Каждый атрибут может иметь одно или несколько значений.

D>Выбрать удовлетворяющие запросу.
Самое простое для каждого значения создать массив, в который поместить ID элементов у которых есть это значение. Массивы отсортировать по ID.
Далее получив запрос берём массивы, соответствующие этим значениям и проводим попарное слияние выкидывая уникальные элементы и оставляя только один из дубликатов.
Если на одном из этапов получили пустой результат, то ничего не найдено.
Для оптимизации нужно начинать с самых маленьких по размеру массивов.
Потребление памяти: размер ID * количество атрибутов * количество записей.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: свести задачу к мат.модели?
От: dinama  
Дата: 11.02.17 18:59
Оценка:
WH>Самое простое для каждого значения создать массив, в который поместить ID элементов у которых есть это значение. Массивы отсортировать по ID.

это инвертированный индекс + пересечение множеств.
действительно самая простая оптимизация.
в дополнение к фильтрации заведомо невалидных запросов.
Re: свести задачу к мат.модели?
От: dinama  
Дата: 14.02.17 08:52
Оценка:
все? идеи исчерпаны?
Re: свести задачу к мат.модели?
От: omgOnoz  
Дата: 16.02.17 21:43
Оценка:
Здравствуйте, dunamo, Вы писали:

D>хотелось оптимизировать задачу математически.

D>например, сразу отбросить те элементы, которые не удовлетворяют заданному набору значений атрибутов (запросу).

Можно хранить список битовых массивов длиной "список людей".

* Список битовых масивов для языков: индекс элемента массива — индекс человека, значение элемента "1" если знает язык, "0" если не знает.
** Тоже самое для стран.

Затраты памяти на такую модель = люди * (языки + страны) битов
Операции выбора = побитовые "и" и "или" и др.

*** Хотим найти людей, которые посещаки одну из стран: побитовое "или" по **
Владеют заданым языком: побитове "и" по * и **
Хотим найти людей, которые посещали несколько стран: побитове "и" по **

ну и т.п.

Задача сводится к банальным операциям множествами.

ИМХО должно работать очень быстро.
Отредактировано 16.02.2017 22:00 omgOnoz . Предыдущая версия . Еще …
Отредактировано 16.02.2017 21:58 omgOnoz . Предыдущая версия .
Отредактировано 16.02.2017 21:57 omgOnoz . Предыдущая версия .
Отредактировано 16.02.2017 21:56 omgOnoz . Предыдущая версия .
Отредактировано 16.02.2017 21:55 omgOnoz . Предыдущая версия .
Re[2]: свести задачу к мат.модели?
От: dinama  
Дата: 19.02.17 12:07
Оценка:
O>Можно хранить список битовых массивов длиной "список людей".

это уже упомянутый тут инвертированный индекс. только с оптимизацией по памяти.
Re[3]: свести задачу к мат.модели?
От: omgOnoz  
Дата: 20.02.17 11:16
Оценка:
Здравствуйте, dinama, Вы писали:

D>это уже упомянутый тут инвертированный индекс. только с оптимизацией по памяти.


И по колличеству операций. Сравнение делать можно не по эллеметно, а пачками 32/64 (размер машинного слова)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.