Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как в большой колекции обьектов найти обьект без прямого применения цыкла for? / 25 сообщений из 59, страница 1 из 3
21.05.2016, 13:52
    #39240664
arrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Например есть большая (тысячи или даже милионы обьектов) колекция, например книг. Использование каждый раз стандартного for -- очень долго. Как это сделать с помощью более специфичесих колекций- например Sеt, Mаp, и их модификаций Sortеd Mаp? Если использовать отображения то я вижу вариант создания нескольких производных карт. Например автор-название, автор-год издания. И при поиске по ключу вывод самого ключа, и значений. И если автор введен не полностью - то уже поиск из возможных вариантов. Правильный ли это подход?
...
Рейтинг: 0 / 0
21.05.2016, 15:06
    #39240680
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
...
Рейтинг: 0 / 0
21.05.2016, 16:08
    #39240691
arrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Нет это первый вопрос был по субд у меня касательно такого поиска, второй - меня спрашивали о колекциях, в частности о необходимости карт отображений. Индекс, ID очевидно необходим и здесь чтобы привязать например автора к ID в виде отображения, а ID соответственно к автору, названию и т.д. Но поиск то надо по автору/названию вести -- и здесь мне непонятно роль отсортированых карт - каким образом идет ускорение поиска - за счет чего достигается например обьект отображения пушкин-35000(id)/или название книги? Если это встроеный механизм sorted map то настолько быстро это действует?
...
Рейтинг: 0 / 0
21.05.2016, 16:54
    #39240704
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
если речь про бинарный поиск то ускорение происходит элементарно.

по отсортированному списку скажем абвгдежзийклмно ты ищешь букву Л - окей, гугл. тыкаем в центр списка и видим: буква Ж. буква Ж меньше буквы Л значит тыкаем в половину второй половины списка, а это буква К. О буква К меньше буквы Л. значит дальше бьем в эту половину половины а это буква М. м больше Л. значит идем назад и опа.. там буква Л. всё. нашли. а теперь пмсчитай количество итераций и сравни с тупой переборкой сначала (или с конца), которая по факту занимает О(н) времени. т.е. линейная. в нашем поиске вышло 4 итерации, а если бы ты крутил от начала - то было бы 12. почувствуйте разницу. мне кажется, у тебя если это был собес, то скорее всего от тебя именно и ждали ответа - бинарный поиск. который применим только к сортированным данным.

надеюсь, я понятно объяснил как он работает ))
...
Рейтинг: 0 / 0
21.05.2016, 18:36
    #39240732
arrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Ну принцип сортировки понятен, но как именно эти отображения использовать - это был главный вопрос (мое предположение имеет смысл?). И касательно отсортированого списка (ключей)? Если идти подряд от 1 элемента к 30500 то это тоже будет достаточно долго. У меня было предположение что в отсортированом списке есть какой то маркер к которому можно обратится и определить что автор на букву П (в даном случае) начинается с 28000 позиции списка, но это наверное неправильно. Если бинарный поиск быстрее в 3 раза -- то это ощутимо, но если мне было сказано что простой перебор очень долго то такой бинарный поиск обеспечит минимум долгий поиск. Если возможно mаp.gеt (n/2) то это обьясняет как найди середину списка, но все это упрощенная версия если взять во внимание что автора/ названия вводим целиком, или хотя бы вводим начало автора или названия.
...
Рейтинг: 0 / 0
21.05.2016, 19:30
    #39240746
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
arrt,
похоже это вопросы с собеседования....
если такое задаётся - то это не то место где надо стараться закрепиться.
это задача чисто для субд.
если это проверка работать с коллекциям - то вопрос надо ставить иначе.
что так же говорит о проблемности с постановкой задач.
...
Рейтинг: 0 / 0
21.05.2016, 19:33
    #39240748
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
я не знаю что от тебя конкретно хотели и какие были доп.условия. но если у тебя есть коллекция и тебе в коллекции надо что-то найти, и коллекшн отсортированный - то искать надо бинарным поиском как мне кажется. и да, он не в 3 раза быстрее, а в n/log(n) раз :) либо вариант хашмапы - там выемка по ключу вообще константная величина.
...
Рейтинг: 0 / 0
21.05.2016, 19:42
    #39240751
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
arrtНу принцип сортировки понятен, но как именно эти отображения использовать - это был главный вопрос (мое предположение имеет смысл?). И касательно отсортированого списка (ключей)? Если идти подряд от 1 элемента к 30500 то это тоже будет достаточно долго. У меня было предположение что в отсортированом списке есть какой то маркер к которому можно обратится и определить что автор на букву П (в даном случае) начинается с 28000 позиции списка, но это наверное неправильно. Если бинарный поиск быстрее в 3 раза -- то это ощутимо, но если мне было сказано что простой перебор очень долго то такой бинарный поиск обеспечит минимум долгий поиск. Если возможно mаp.gеt (n/2) то это обьясняет как найди середину списка, но все это упрощенная версия если взять во внимание что автора/ названия вводим целиком, или хотя бы вводим начало автора или названия.
кстати по мапам - далеко не все хранят порядок , т.е. там нет понятия "середина". порядок только (что мне в голову прилетает) у линкедхашмап и тримап т.к. она вообще сортированная. и если у тебя ключ пушкин а буквы только пушк то как вариант - вытащить вначале ключи в коллекцию, а там по ней уже бинаркой пройтись. найти ключ и из ключа выдрать значение на скорости О(1).
...
Рейтинг: 0 / 0
21.05.2016, 19:51
    #39240754
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
вадяarrt,
похоже это вопросы с собеседования....
если такое задаётся - то это не то место где надо стараться закрепиться.
это задача чисто для субд.
если это проверка работать с коллекциям - то вопрос надо ставить иначе.
что так же говорит о проблемности с постановкой задач.
Я тоже как то приводил пример "а как сделать то то и то то в коллекции на 20.000.000 записей". и на ответ если у тебя появилась такая задача - то ты явно что-то не так делаешь, на меня напали с криками "и такое бывает"
...
Рейтинг: 0 / 0
21.05.2016, 20:15
    #39240756
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Сейчас создал хашмап из 2х миллионов карт, стринг стринг. скорость вытаскивания по ключу - 0 (что и следовало из О(1) собссно). скорость добавления 700миллисекунд. долго да? )) а у тебя задача 30500 ???
...
Рейтинг: 0 / 0
21.05.2016, 20:33
    #39240761
arrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Если вопрос касается субд и колекций значит его можно реализовать и через колекции. Вопрос как? Ну если мое предположение неправильно то как можно иначе? Моя идея такая: списку книг с полями автор, название, год выпуска назначается и четвертое поле id. Потом на основание этой колекции: делается три карты отображение Sortedmap -- автор-id, название-id.. Если соответствие нашло выводим свойства обьекта через list.gеt(id).author и т.д.
...
Рейтинг: 0 / 0
21.05.2016, 20:36
    #39240762
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
arrtЕсли вопрос касается субд и колекций значит его можно реализовать и через колекции. Вопрос как? Ну если мое предположение неправильно то как можно иначе? Моя идея такая: списку книг с полями автор, название, год выпуска назначается и четвертое поле id. Потом на основание этой колекции: делается три карты отображение Sortedmap -- автор-id, название-id.. Если соответствие нашло выводим свойства обьекта через list.gеt(id).author и т.д.
30500 записей в листе - это ничто. мне кажется, там вообще соображать смысла особо нет. хочешь - переборкой тупой найди ) если в контексте дб - то выдрать два поля автор-название. и по ним гулять. Ну реально, это ниачом. Сотые доли секунды.
...
Рейтинг: 0 / 0
22.05.2016, 00:15
    #39240805
arrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Мой подход имеет право на жизнь? 30500 - это просто я для примера привел - вопрос мне задавали на случай сотни тысяч или даже милионов. И не верю что вопрос был просто так что бы ввести в заблуждение и сказать "я не знаю". Иной вопрос был типичный из джава интервью квесшнс.
...
Рейтинг: 0 / 0
22.05.2016, 09:00
    #39240841
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
2 миллиона записей за 0.7 сек добавление и выборка за даже меньшее время - это медленно или как? это в десять раз больше, чем 200 тысяч. а "миллионы" записей боюсь, аутофмемори ты словишь быстрее, чем у тебя в проц упрется. :)

мне интересно, а что будет если его спросить "а вы сами то пробовали делать выборку в коллекции на 30500 записей или так на хабре вопросов надрали?".

твой подход копирует (судя по тому что я понял) такую штуку, которая называется "ассоциативный массив", который изобрели еще в 1956м году и который в яве называется хэшмап :) понимаешь, суть в том, что они тебя заставляют придумывать велосипед. который мало того что есть, так он еще и не нужен.
...
Рейтинг: 0 / 0
22.05.2016, 09:41
    #39240845
arrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Спросили, а вопрос для меня остался. Хешмап или сортедмап - но одним таким отображением не обойдешся. А вот если взять их по количеству полей обьекта - может подойти. Сперва предполагал что это тривиальный вопрос, вопрос из практики. Если таким способом можно хоть в рады ускорить поиск после построения трех карт отображений - наверное это подходящий вариант. Но соответствует ли мой подход то что меня спрашивали не знаю, ибо сперва предполагал что скорость поиска будет так в 10 раз выше.
...
Рейтинг: 0 / 0
22.05.2016, 11:45
    #39240862
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
раз в 10 выше чем что? вытаскивать по ключу - мгновенно (ну почти) независимо от размера карты. по факту искать (как я понял) тебе надо по автору по маске. ОУКЕЙ. итерируй сет ключей (если автор = ключ). 35000 ключей стринговых - это ничто. нашел ключ - дергаешь по ключу произведения.
...
Рейтинг: 0 / 0
22.05.2016, 14:30
    #39240893
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
arrt, эта тема (ее теоретическая) часть давно изучена в оптимизации SQL запросов.

В ответ на DML оператор

Код: sql
1.
delete from books where ......



SQL-оптимизатор строит план исполнения запроса который базируется форме предиката
WHERE и на статистических показателях самих данных.

Твой вопрос in general, вобщем не имеет правильного решения до тех пор пока не будем
знать все условия.
...
Рейтинг: 0 / 0
23.05.2016, 18:15
    #39241606
arrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Вроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо?
...
Рейтинг: 0 / 0
23.05.2016, 18:25
    #39241613
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
arrtВроде задание простое.
Смотря для кого.

arrtАльтернатива использованию бд.
БД сейчас на много большее понятие чем RDBMS.

arrtНадо намного быстрее
Быстрее чем проиндексированная in-memory database у тебя вряд ли получится.

arrt, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for.

Почему с помощью map? Под циклом for понимается ключевое слово в Java или итеративный процесс вообще?

arrtКакие еще дополнительные условия надо?
Вы ставите задачу и спрашиваете какие "надо условия"? Условия чего? Задачи?

Я знаю только два решения.
1) Построение индекса. Это такая коллекция, которая на много меньше нашей основной коллекции и хранит частичную информацию о том где что-то искать в нашей коллекции. Индексы бывают разными. HashMap и любое дерево можно использовать как пример индекса.
2) Многопоточный и многопроцессорный поиск aka Map\Reduce. Суть в том что коллекция разделяется на части и каждую часть прочесывает отдельный процесс. Сейчас поднять комп в облаке стоит копейки, поэтому для единоразовых акций это отличное решение. Правда, это в некотором роде вышеупомянутый for.

Эти двое, обычно, комбинируются. Так как производительность с индексом увеличивается очень сильно. А MapReduce позволяет выжать из железа максимум.
...
Рейтинг: 0 / 0
23.05.2016, 19:33
    #39241672
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
arrtВроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо?
Быстрее всего - использовать различные ленивые оптимизации. Например вместо удаления
книг из коллекций - создать новую коллекцию и перенести туда те которые надо оставить.
Это в том случае когда мы чистим 99% всего.

Чудно ? Правда? Но работает.
...
Рейтинг: 0 / 0
24.05.2016, 00:23
    #39241775
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
arrtНапример есть большая (тысячи или даже милионы обьектов) колекция, например книг. Использование каждый раз стандартного for -- очень долго. Как это сделать с помощью более специфичесих колекций- например Sеt, Mаp, и их модификаций Sortеd Mаp? Если использовать отображения то я вижу вариант создания нескольких производных карт. Например автор-название, автор-год издания. И при поиске по ключу вывод самого ключа, и значений. И если автор введен не полностью - то уже поиск из возможных вариантов. Правильный ли это подход?


а Stream из Java 8 смотрели ?
...
Рейтинг: 0 / 0
24.05.2016, 00:25
    #39241777
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
...
Рейтинг: 0 / 0
24.05.2016, 11:40
    #39242028
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
arrtВроде задание простое. Альтернатива использованию бд. Надо намного быстрее, в общем случае, найти какой то атрибут обьекта колекции с помощью map не используя стандартный цыкл for. Какие еще дополнительные условия надо?
У тебя есть тестовый набор данных? Хотя-бы строк несколько тыщ? Книга-название-автор-год издания e.t.c.
...
Рейтинг: 0 / 0
24.05.2016, 14:51
    #39242330
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
Blazkowicz2) Многопоточный и многопроцессорный поиск aka Map\Reduce. Суть в том что коллекция разделяется на части и каждую часть прочесывает отдельный процесс. Сейчас поднять комп в облаке стоит копейки, поэтому для единоразовых акций это отличное решение. Правда, это в некотором роде вышеупомянутый for.

С каких пор Map/Reduce стал алгоритмом поиска? Скорее это агрегация данных.
...
Рейтинг: 0 / 0
24.05.2016, 14:59
    #39242344
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в большой колекции обьектов найти обьект без прямого применения цыкла for?
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.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как в большой колекции обьектов найти обьект без прямого применения цыкла for? / 25 сообщений из 59, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]