свести задачу к мат.модели?
От: dunamo  
Дата: 08.02.17 11:55
Оценка:
Возможно-ли свести к какой-либо математической модели оптимизацию решения след. задачи —

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

Данные редко-изменяемые. Есть возможность выполнить какие-то предварительные расчеты, свести к системе уравнений, матрице и ТД.


Например:

Есть страны и языки. Есть список людей, для которых задано какие страны он посещал и какими языками владеет.

Запрос:

Выбрать людей которые посещали одну из заданных стран и владеют одним из заданных языков.


понятно, что есть прямой перебор, выбор по индексу с обработкой уже выбранных и ТД.

хотелось оптимизировать задачу математически.
например, сразу отбросить те элементы, которые не удовлетворяют заданному набору значений атрибутов (запросу).
Re: свести задачу к мат.модели?
От: Code Digger Грузия  
Дата: 08.02.17 12:13
Оценка: +3 :)
Здравствуйте, dunamo, Вы писали:

D>Возможно-ли свести к какой-либо математической модели оптимизацию решения след. задачи —


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

D>Выбрать удовлетворяющие запросу.

Есть такая мат. модель. Называется "реляционная алгебра". Очень рекомендую.
Re[2]: свести задачу к мат.модели?
От: dinama  
Дата: 08.02.17 12:32
Оценка:
CD>Есть такая мат. модель. Называется "реляционная алгебра". Очень рекомендую.

можно было просто написать "я умный".
у меня есть структура данных в памяти и язык программирования нереляционный. построить индексы атрибутов и организовать перебор не проблема. хочется красивого.
Re: свести задачу к мат.модели?
От: Буравчик Россия  
Дата: 08.02.17 15:27
Оценка:
Здравствуйте, dunamo, Вы писали:

D>Возможно-ли свести к какой-либо математической модели оптимизацию решения след. задачи —


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

D>Выбрать удовлетворяющие запросу.

Примеры запросов "в студию"
Best regards, Буравчик
Re[2]: свести задачу к мат.модели?
От: dinama  
Дата: 08.02.17 15:36
Оценка:
Б>Примеры запросов "в студию"


в первом сообщении-же пример.
это не база данных и не sql.
Re[3]: свести задачу к мат.модели?
От: Qulac Россия  
Дата: 08.02.17 15:50
Оценка:
Здравствуйте, dinama, Вы писали:

Б>>Примеры запросов "в студию"



D>в первом сообщении-же пример.

D>это не база данных и не sql.

Можно представить в виде множеств: множество тех кто бы в этой стране, множество тех кто знает такой-то язык и т.д. Ну операции с этими множествами. Это всё равно не далеко от реляционной алгебры.
Программа – это мысли спрессованные в код
Re[4]: свести задачу к мат.модели?
От: dinama  
Дата: 08.02.17 15:57
Оценка:
Q>Можно представить в виде множеств: множество тех кто бы в этой стране, множество тех кто знает такой-то язык и т.д. Ну операции с этими множествами. Это всё равно не далеко от реляционной алгебры.

ну это и есть последовательный перебор. только много множеств не нужно — выбираем А, из тех выбираем Б и тд.
это если не ошибаюсь — M*N*log(K) (M- число элеметнов, N число арибутов, К число значений атрибута)

а хочется какой-нибудь многомерной матрицы пространства и вычисление подпространства, или отбрасывание подпространства. в одно математическое действие )
Re[5]: свести задачу к мат.модели?
От: Qulac Россия  
Дата: 08.02.17 16:11
Оценка:
Здравствуйте, dinama, Вы писали:



Q>>Можно представить в виде множеств: множество тех кто бы в этой стране, множество тех кто знает такой-то язык и т.д. Ну операции с этими множествами. Это всё равно не далеко от реляционной алгебры.


D>ну это и есть последовательный перебор. только много множеств не нужно — выбираем А, из тех выбираем Б и тд.

D>это если не ошибаюсь — M*N*log(K) (M- число элеметнов, N число арибутов, К число значений атрибута)

D>а хочется какой-нибудь многомерной матрицы пространства и вычисление подпространства, или отбрасывание подпространства. в одно математическое действие )


Это типа данные представляются в виде точки в n-мерном пространстве, где координаты это значение одного из атрибутов? Тогда выборка это просто взятие n-мерного куба из этого пространства. Дело в том, что на бумаге это может выглядеть как одна простая операция, типа квадратного корня, а на деле требует много операций для своего вычисления.
Программа – это мысли спрессованные в код
Re[6]: свести задачу к мат.модели?
От: dinama  
Дата: 08.02.17 16:19
Оценка: +1
Q>Это типа данные представляются в виде точки в n-мерном пространстве, где координаты это значение одного из атрибутов? Тогда выборка это просто взятие n-мерного куба из этого пространства. Дело в том, что на бумаге это может выглядеть как одна простая операция, типа квадратного корня, а на деле требует много операций для своего вычисления.


да, что-нибудь эдакое. мозг совсем уже атрофировался от ширпотребных задач.
Отредактировано 08.02.2017 16:20 dinama . Предыдущая версия .
Re[7]: свести задачу к мат.модели?
От: Джеффри  
Дата: 08.02.17 18:36
Оценка: 8 (2)
Здравствуйте, dinama, Вы писали:

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


Я думаю, что тут многое зависит от того, какого вида будут запросы. Например, только операции равенства / вхождение в множество или могут быть больше / меншье. Дальше, как запросы могут комбинироваться друг с другом — например, могут ли быть запросы вида "или ... или ...".

Как вариант, можно посмотреть на фильтры Блума:

Фильтр Блума (англ. Bloom filter) — это вероятностная структура данных, позволяющая компактно хранить множество элементов и проверять принадлежность заданного элемента к множеству:
...
Объединение и пересечение двух фильтров Блума одинакового размера и c одинаковым множеством хеш-функций может быть реализовано побитовыми операциями OR и AND над их битовыми массивами.

Re: свести задачу к мат.модели?
От: ksandro Мухосранск  
Дата: 09.02.17 13:30
Оценка:
Здравствуйте, dunamo, Вы писали:

D>Возможно-ли свести к какой-либо математической модели оптимизацию решения след. задачи —


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

D>Выбрать удовлетворяющие запросу.

D>Данные редко-изменяемые. Есть возможность выполнить какие-то предварительные расчеты, свести к системе уравнений, матрице и ТД.



D>

D>Например:

D>Есть страны и языки. Есть список людей, для которых задано какие страны он посещал и какими языками владеет.

D>Запрос:

D>Выбрать людей которые посещали одну из заданных стран и владеют одним из заданных языков.


D>понятно, что есть прямой перебор, выбор по индексу с обработкой уже выбранных и ТД.


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

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

Обычная хэш таблица. В качестве ключа должна быть комбинация из страны и языка (ну или нужных атрибутов), в качестве значения человек. Сразу при создании кидаем человека в хэш таблицу, а потом по ключу быстро и легко вытаскиваем нужных людей из таблицы.

Тут только надо правильно скомбинировать атрибуты и придумать, что лучше использовать в качестве хэша. Но, думаю это детали реализации.
Re[7]: свести задачу к мат.модели?
От: ksandro Мухосранск  
Дата: 09.02.17 13:44
Оценка:
Здравствуйте, dinama, Вы писали:


Q>>Это типа данные представляются в виде точки в n-мерном пространстве, где координаты это значение одного из атрибутов? Тогда выборка это просто взятие n-мерного куба из этого пространства. Дело в том, что на бумаге это может выглядеть как одна простая операция, типа квадратного корня, а на деле требует много операций для своего вычисления.


Поздравляю, вы изобрели хэш-функцию!!!! Надо еще немного напрячь мозги и подумать над структурой данных, как это все хранить и, может быть, изобретете хэш таблицу


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


Народ, помоему вы все как-то сильно переусложнили, это одна из самых ширпотребных задач.
Отредактировано 09.02.2017 13:50 ksandro . Предыдущая версия .
Re[8]: свести задачу к мат.модели?
От: dinama  
Дата: 10.02.17 10:07
Оценка:
Д>Как вариант, можно посмотреть на фильтры Блума:

интересная идейка. надо только свести наборы атрибутов/запрос к данным которые будут хешироваться.
но эта тема для фильтрации запросов, которые точно ничего не найдут.
Отредактировано 10.02.2017 10:41 dinama . Предыдущая версия .
Re[2]: свести задачу к мат.модели?
От: dinama  
Дата: 10.02.17 10:12
Оценка:
K>Обычная хэш таблица.

не совсем обычная.
для каждого сочетания атрибутов элемента — одно значение. и для запроса аналогично.
E элементов
A атрибутов
N значений каждого атрибута
посчитайте сколько получится паросочетаний.
и с запросом придется то-же самое делать. и опять-же для каждого паросочетания атрибутов в запросе — множество, которое затем пересекать.
Re[3]: свести задачу к мат.модели?
От: ksandro Мухосранск  
Дата: 10.02.17 13:31
Оценка:
Здравствуйте, dinama, Вы писали:

K>>Обычная хэш таблица.


D>не совсем обычная.

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

Может я не совсем задачу понял задачу...

Атрибуты по которым делается запрос известны заранее. Из комбинации атрибутов создаем ключ.Все это засовывается в стандартный контейнер (unordered_map в с++, HashMap в java).
Ключ и такую коллекцию создаете для каждой комбинации атрибутов по которой может делаться запрос.

Или у вас комбинации атрибутов по котором будут делаться запросы неизвестна заранее и пользователь каждый раз задает набор из множества атрибутов для нового запроса?
Re[4]: свести задачу к мат.модели?
От: dinama  
Дата: 10.02.17 13:36
Оценка:
K>Может я не совсем задачу понял задачу...
K>Атрибуты по которым делается запрос известны заранее. Из комбинации атрибутов создаем ключ.Все это засовывается в стандартный контейнер (unordered_map в с++, HashMap в java).
K>Ключ и такую коллекцию создаете для каждой комбинации атрибутов по которой может делаться запрос.
K>Или у вас комбинации атрибутов по котором будут делаться запросы неизвестна заранее и пользователь каждый раз задает набор из множества атрибутов для нового запроса?


коллекция к которой делается запрос — неизменяема.
а запросы могут быть разные.
так-что если делать "ключ" из комбинаций атрибутов, то это могут быть десятки миллионов ключей.
если например, в коллекции 1000 элементов. по 10 атрибутов, которые имеют по 30 значений, то это
300000 тысяч ключей.

если пришел запрос, в котором для каждого атрибута задано по 10 допустимых значений, то это
100 запросов к хештаблице, с последующей вставкой в упорядоченый список.

сомнительная оптмизация.

лучше уж как выше написали отбросить фильтром Блума невалидные запросы, а дальше по старинке.
Re[5]: свести задачу к мат.модели?
От: ksandro Мухосранск  
Дата: 10.02.17 14:28
Оценка:
Здравствуйте, dinama, Вы писали:

D>коллекция к которой делается запрос — неизменяема.

D>а запросы могут быть разные.
D>так-что если делать "ключ" из комбинаций атрибутов, то это могут быть десятки миллионов ключей.
D>если например, в коллекции 1000 элементов. по 10 атрибутов, которые имеют по 30 значений, то это
D>300000 тысяч ключей.

Мы оптимизируем память или время работы?

Похоже я все таки не понял задачу. Будет ли каждый запрос включать все 10 атрибутов, или в одном запросе может быть 1 атрибут, в другом например первый и третий атрибуты и тд.

Хэш таблица будет хранить не все 300000 ключей а их хеши, которых будет меньше. Но если коллекция порядка 1000 элементов то на практике все оптимизации только ухудшат скорость работы. Линейный поиск будет давать лучший результат. В изначальном примере было только 2 атрибута.


D>если пришел запрос, в котором для каждого атрибута задано по 10 допустимых значений, то это

D>100 запросов к хештаблице, с последующей вставкой в упорядоченый список.

Ну да, 10 атрибутов по 10 значений, в результате вы должны достать из таблицы 100 элементов, и да для этого надо 100 запросов. Если у вас хорошие хэш функции то можно считать что сложность запроса O(1)

Про последующую вставку в упорядоченный список ничего не говорилось. Можно поподробнее про это?
Отредактировано 10.02.2017 14:46 ksandro . Предыдущая версия . Еще …
Отредактировано 10.02.2017 14:30 ksandro . Предыдущая версия .
Re[6]: свести задачу к мат.модели?
От: dinama  
Дата: 10.02.17 14:50
Оценка:
K>И вообще если коллекция порядка 1000 элементов то на практике все оптимизации только ухудшат скорость работы. Линейный поиск будет давать лучший результат.

на самом дели три разные ситуации:

1. большинство запросов не имеют результат
2. каждый результативный запрос извлекает большинство элементов
3. каждый запрос извлекает минимальное количество элементов

в первом случае оптимизацией будет отбросить "заведомо нерезультативные запросы" (например, упомянутый тут фильтр Блума)
во-втором случае — оптимизации не требуются
в третьем случае — здорово было-бы извлекать быстро удовлетворяющие запросу элементы

K>Про последующую вставку в упорядоченный список ничего не говорилось. Можно поподробнее про это?


если элемент Е имеет значения атрибута A (a1, a2) и атрибута B (b1, b2)
то в хеш этот элемент должен быть вставлен 4 раза: a1b1 a2b1 a1b2 a2b2

для получения результирующей выборки нам нужно исключить дубликаты, т.е. это будет упорядоченое множество, вставка в которое — дополнительное логарифмическое время.
Отредактировано 10.02.2017 15:34 dinama . Предыдущая версия .
Re[7]: свести задачу к мат.модели?
От: ksandro Мухосранск  
Дата: 10.02.17 15:27
Оценка:
Здравствуйте, dinama, Вы писали:

D>если элемент Е имеет значения атрибута A (a1, a2) и атрибута B (b1, b2)

D>то в хеш этот элемент должен быть вставлен 4 раза: a1b1 a2b1 a1b2 a2b2

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


Ну, тут можно придумать что-нибудь хитрое, например держать в хеш таблице указатели на элемент E и помечать его как уже выбранный после первой выборки, но это так, просто мысли.... я это не предлагаю.
Соглашусь что при больом количестве атрибутов и значеий атрибутов для каждого элемента, простая хэш таблица не лучший вариант.
Re[8]: свести задачу к мат.модели?
От: dinama  
Дата: 10.02.17 15:33
Оценка:
K>например держать в хеш таблице указатели на элемент E и помечать его как уже выбранный после первой выборки, но это так, просто мысли.... я это не предлагаю.

структура данных "неизменяемая", что позволяет разделять ее между процессами без синхронизаций. так что добавление
чего-либо изменяемого невозможно, а в контексте запроса это строить — опять аллокации, структуры и т.д. не комильфо.
тем-более на больших объемах.

у меня на самом деле "первый" случай — доля результативных запросов очень мала, так-что поиграюсь с фильтром блума.
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...
Пока на собственное сообщение не было ответов, его можно удалить.