|
|
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Например есть большая (тысячи или даже милионы обьектов) колекция, например книг. Использование каждый раз стандартного for -- очень долго. Как это сделать с помощью более специфичесих колекций- например Sеt, Mаp, и их модификаций Sortеd Mаp? Если использовать отображения то я вижу вариант создания нескольких производных карт. Например автор-название, автор-год издания. И при поиске по ключу вывод самого ключа, и значений. И если автор введен не полностью - то уже поиск из возможных вариантов. Правильный ли это подход? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 13:52 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 15:06 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Нет это первый вопрос был по субд у меня касательно такого поиска, второй - меня спрашивали о колекциях, в частности о необходимости карт отображений. Индекс, ID очевидно необходим и здесь чтобы привязать например автора к ID в виде отображения, а ID соответственно к автору, названию и т.д. Но поиск то надо по автору/названию вести -- и здесь мне непонятно роль отсортированых карт - каким образом идет ускорение поиска - за счет чего достигается например обьект отображения пушкин-35000(id)/или название книги? Если это встроеный механизм sorted map то настолько быстро это действует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 16:08 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
если речь про бинарный поиск то ускорение происходит элементарно. по отсортированному списку скажем абвгдежзийклмно ты ищешь букву Л - окей, гугл. тыкаем в центр списка и видим: буква Ж. буква Ж меньше буквы Л значит тыкаем в половину второй половины списка, а это буква К. О буква К меньше буквы Л. значит дальше бьем в эту половину половины а это буква М. м больше Л. значит идем назад и опа.. там буква Л. всё. нашли. а теперь пмсчитай количество итераций и сравни с тупой переборкой сначала (или с конца), которая по факту занимает О(н) времени. т.е. линейная. в нашем поиске вышло 4 итерации, а если бы ты крутил от начала - то было бы 12. почувствуйте разницу. мне кажется, у тебя если это был собес, то скорее всего от тебя именно и ждали ответа - бинарный поиск. который применим только к сортированным данным. надеюсь, я понятно объяснил как он работает )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 16:54 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Ну принцип сортировки понятен, но как именно эти отображения использовать - это был главный вопрос (мое предположение имеет смысл?). И касательно отсортированого списка (ключей)? Если идти подряд от 1 элемента к 30500 то это тоже будет достаточно долго. У меня было предположение что в отсортированом списке есть какой то маркер к которому можно обратится и определить что автор на букву П (в даном случае) начинается с 28000 позиции списка, но это наверное неправильно. Если бинарный поиск быстрее в 3 раза -- то это ощутимо, но если мне было сказано что простой перебор очень долго то такой бинарный поиск обеспечит минимум долгий поиск. Если возможно mаp.gеt (n/2) то это обьясняет как найди середину списка, но все это упрощенная версия если взять во внимание что автора/ названия вводим целиком, или хотя бы вводим начало автора или названия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 18:36 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
arrt, похоже это вопросы с собеседования.... если такое задаётся - то это не то место где надо стараться закрепиться. это задача чисто для субд. если это проверка работать с коллекциям - то вопрос надо ставить иначе. что так же говорит о проблемности с постановкой задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 19:30 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
я не знаю что от тебя конкретно хотели и какие были доп.условия. но если у тебя есть коллекция и тебе в коллекции надо что-то найти, и коллекшн отсортированный - то искать надо бинарным поиском как мне кажется. и да, он не в 3 раза быстрее, а в n/log(n) раз :) либо вариант хашмапы - там выемка по ключу вообще константная величина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 19:33 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
arrtНу принцип сортировки понятен, но как именно эти отображения использовать - это был главный вопрос (мое предположение имеет смысл?). И касательно отсортированого списка (ключей)? Если идти подряд от 1 элемента к 30500 то это тоже будет достаточно долго. У меня было предположение что в отсортированом списке есть какой то маркер к которому можно обратится и определить что автор на букву П (в даном случае) начинается с 28000 позиции списка, но это наверное неправильно. Если бинарный поиск быстрее в 3 раза -- то это ощутимо, но если мне было сказано что простой перебор очень долго то такой бинарный поиск обеспечит минимум долгий поиск. Если возможно mаp.gеt (n/2) то это обьясняет как найди середину списка, но все это упрощенная версия если взять во внимание что автора/ названия вводим целиком, или хотя бы вводим начало автора или названия. кстати по мапам - далеко не все хранят порядок , т.е. там нет понятия "середина". порядок только (что мне в голову прилетает) у линкедхашмап и тримап т.к. она вообще сортированная. и если у тебя ключ пушкин а буквы только пушк то как вариант - вытащить вначале ключи в коллекцию, а там по ней уже бинаркой пройтись. найти ключ и из ключа выдрать значение на скорости О(1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 19:42 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
вадяarrt, похоже это вопросы с собеседования.... если такое задаётся - то это не то место где надо стараться закрепиться. это задача чисто для субд. если это проверка работать с коллекциям - то вопрос надо ставить иначе. что так же говорит о проблемности с постановкой задач. Я тоже как то приводил пример "а как сделать то то и то то в коллекции на 20.000.000 записей". и на ответ если у тебя появилась такая задача - то ты явно что-то не так делаешь, на меня напали с криками "и такое бывает" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 19:51 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Сейчас создал хашмап из 2х миллионов карт, стринг стринг. скорость вытаскивания по ключу - 0 (что и следовало из О(1) собссно). скорость добавления 700миллисекунд. долго да? )) а у тебя задача 30500 ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 20:15 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Если вопрос касается субд и колекций значит его можно реализовать и через колекции. Вопрос как? Ну если мое предположение неправильно то как можно иначе? Моя идея такая: списку книг с полями автор, название, год выпуска назначается и четвертое поле id. Потом на основание этой колекции: делается три карты отображение Sortedmap -- автор-id, название-id.. Если соответствие нашло выводим свойства обьекта через list.gеt(id).author и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 20:33 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
arrtЕсли вопрос касается субд и колекций значит его можно реализовать и через колекции. Вопрос как? Ну если мое предположение неправильно то как можно иначе? Моя идея такая: списку книг с полями автор, название, год выпуска назначается и четвертое поле id. Потом на основание этой колекции: делается три карты отображение Sortedmap -- автор-id, название-id.. Если соответствие нашло выводим свойства обьекта через list.gеt(id).author и т.д. 30500 записей в листе - это ничто. мне кажется, там вообще соображать смысла особо нет. хочешь - переборкой тупой найди ) если в контексте дб - то выдрать два поля автор-название. и по ним гулять. Ну реально, это ниачом. Сотые доли секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2016, 20:36 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Мой подход имеет право на жизнь? 30500 - это просто я для примера привел - вопрос мне задавали на случай сотни тысяч или даже милионов. И не верю что вопрос был просто так что бы ввести в заблуждение и сказать "я не знаю". Иной вопрос был типичный из джава интервью квесшнс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2016, 00:15 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
2 миллиона записей за 0.7 сек добавление и выборка за даже меньшее время - это медленно или как? это в десять раз больше, чем 200 тысяч. а "миллионы" записей боюсь, аутофмемори ты словишь быстрее, чем у тебя в проц упрется. :) мне интересно, а что будет если его спросить "а вы сами то пробовали делать выборку в коллекции на 30500 записей или так на хабре вопросов надрали?". твой подход копирует (судя по тому что я понял) такую штуку, которая называется "ассоциативный массив", который изобрели еще в 1956м году и который в яве называется хэшмап :) понимаешь, суть в том, что они тебя заставляют придумывать велосипед. который мало того что есть, так он еще и не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2016, 09:00 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Спросили, а вопрос для меня остался. Хешмап или сортедмап - но одним таким отображением не обойдешся. А вот если взять их по количеству полей обьекта - может подойти. Сперва предполагал что это тривиальный вопрос, вопрос из практики. Если таким способом можно хоть в рады ускорить поиск после построения трех карт отображений - наверное это подходящий вариант. Но соответствует ли мой подход то что меня спрашивали не знаю, ибо сперва предполагал что скорость поиска будет так в 10 раз выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2016, 09:41 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
раз в 10 выше чем что? вытаскивать по ключу - мгновенно (ну почти) независимо от размера карты. по факту искать (как я понял) тебе надо по автору по маске. ОУКЕЙ. итерируй сет ключей (если автор = ключ). 35000 ключей стринговых - это ничто. нашел ключ - дергаешь по ключу произведения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2016, 11:45 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
arrt, эта тема (ее теоретическая) часть давно изучена в оптимизации SQL запросов. В ответ на DML оператор Код: sql 1. SQL-оптимизатор строит план исполнения запроса который базируется форме предиката WHERE и на статистических показателях самих данных. Твой вопрос in general, вобщем не имеет правильного решения до тех пор пока не будем знать все условия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2016, 14:30 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Вроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 18:15 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
arrtВроде задание простое. Смотря для кого. arrtАльтернатива использованию бд. БД сейчас на много большее понятие чем RDBMS. arrtНадо намного быстрее Быстрее чем проиндексированная in-memory database у тебя вряд ли получится. arrt, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Почему с помощью map? Под циклом for понимается ключевое слово в Java или итеративный процесс вообще? arrtКакие еще дополнительные условия надо? Вы ставите задачу и спрашиваете какие "надо условия"? Условия чего? Задачи? Я знаю только два решения. 1) Построение индекса. Это такая коллекция, которая на много меньше нашей основной коллекции и хранит частичную информацию о том где что-то искать в нашей коллекции. Индексы бывают разными. HashMap и любое дерево можно использовать как пример индекса. 2) Многопоточный и многопроцессорный поиск aka Map\Reduce. Суть в том что коллекция разделяется на части и каждую часть прочесывает отдельный процесс. Сейчас поднять комп в облаке стоит копейки, поэтому для единоразовых акций это отличное решение. Правда, это в некотором роде вышеупомянутый for. Эти двое, обычно, комбинируются. Так как производительность с индексом увеличивается очень сильно. А MapReduce позволяет выжать из железа максимум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 18:25 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
arrtВроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо? Быстрее всего - использовать различные ленивые оптимизации. Например вместо удаления книг из коллекций - создать новую коллекцию и перенести туда те которые надо оставить. Это в том случае когда мы чистим 99% всего. Чудно ? Правда? Но работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 19:33 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
arrtНапример есть большая (тысячи или даже милионы обьектов) колекция, например книг. Использование каждый раз стандартного for -- очень долго. Как это сделать с помощью более специфичесих колекций- например Sеt, Mаp, и их модификаций Sortеd Mаp? Если использовать отображения то я вижу вариант создания нескольких производных карт. Например автор-название, автор-год издания. И при поиске по ключу вывод самого ключа, и значений. И если автор введен не полностью - то уже поиск из возможных вариантов. Правильный ли это подход? а Stream из Java 8 смотрели ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2016, 00:23 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2016, 00:25 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
arrtВроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо? У тебя есть тестовый набор данных? Хотя-бы строк несколько тыщ? Книга-название-автор-год издания e.t.c. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2016, 11:40 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz2) Многопоточный и многопроцессорный поиск aka Map\Reduce. Суть в том что коллекция разделяется на части и каждую часть прочесывает отдельный процесс. Сейчас поднять комп в облаке стоит копейки, поэтому для единоразовых акций это отличное решение. Правда, это в некотором роде вышеупомянутый for. С каких пор Map/Reduce стал алгоритмом поиска? Скорее это агрегация данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2016, 14:51 |
|
||
|
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
|
|||
|---|---|---|---|
|
#18+
HettС каких пор Map/Reduce стал алгоритмом поиска? Скорее это агрегация данных. Во-первых, слово "алгоритм", вроде, до вас тут никто не упоминал. Во-вторых Map/Reduce это способ распределения задач для обработки большого набора данных. Решать этим способом можно разные задачи, а не только считать агрегаты. В-третих, обратимся, например, к википедии. https://en.wikipedia.org/wiki/MapReduce MapReduce is useful in a wide range of applications, including distributed pattern-based searching , distributed sorting, web link-graph reversal, Singular Value Decomposition,[16] web access log stats, inverted index construction, document clustering, machine learning,[17] and statistical machine translation. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2016, 14:59 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=95&tid=2124005]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 357ms |

| 0 / 0 |
