|
|
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Привет всем! Помогите с задачкой. Необходимо реализовать функцию подбора наиболее часто встречающихся запросов по частично введенной строке. Есть файл с входными значениями формата (строка пробел число), кол-во таких значений не более 10 5 в этом же файле есть набор подстрок в формате (строка), таких значений не более 15000 Необходимо для каждой подстроки вывести в выходной файл 10 наиболее часто встречающихся строк (запросов из первой части файла). Алгоритм следующий: читаю все строки и числа в TreeMap<String, Integer> map читаю все подстроки в ArrayList<String> list Для каждой подстроки нахожу совпадения map.subMap() Полученный Map сортирую по значению и пишу в файл 10 самых часто встречающихся запросов Собственно говоря все работает... НО временные ограничения 2 сек, а у меня 8-12 сек. и узкое место именно эта сортировка. Вопрос вот в чем: Может быть я принципиально что-то не так делаю? Можно ли ускорить сортировку (писать их в отдельные потоки/нити, или делать частичную сортировку, правда не знаю пока как)? Файл с кодом во вложении. Заранее спасибо за любые ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 19:05 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
acmp.ru опять что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 19:10 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Fabus, Пример входного файла есть? Что за число? Количество сколько раз встречается строка? В подобных случаях нет смысла всё грузить в память и сортировать. Нужно при чтении формировать результат. Зачем сортировать вообще все строки, если сортировать нужно только те, которые относятся к подстроке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 19:17 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Не совсем понятно задание. Может быть такой входной файл? Input: Код: java 1. 2. 3. 4. 5. 6. 7. Могут ли быть дубликаты ключей в первой части? Почему речь идет о "подстроке"? Для "mayton" будет ли "ton" являться подстрокой в данной имплементации алгоритма? Почему outMap декларирован как HashMap? Это не соответствует смыслу возвращаемого результата subMap. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 23:35 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Пример входного файла: 6 base 10 bass 20 back 1 ablack 7 black 7 good 3 8 b ba bas a ab ga go a где первая цифра (6) - количество запросов далее сами запросы (уникальны) и частота встречаемости далее цифра (8) - подстроки (не уникальны и выполняются для каждой , неважно, встречалась она или нет) далее идут подстроки Выходной файл должен иметь вид: bass base black back bass base back bass base ablack ablack good ablack ответ на каждую подстроку разделяем пустой строкой. если частота встечаемости одинакова, выводим в алфавитном порядке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 04:47 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, походу да.... был там давно-давно.. спасибо за наводку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 04:50 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Все строки и не сортируются. сначала выделяются совпадения подстроки в запросах, и уже затем полученный Map сортируется по Value для выделения наиболее часто встречаемых запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 05:10 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
mayton, 3 mayton 1 Fabus 2 Blashkovich 3 2 m B Могут ли быть дубликаты ключей в первой части? Нет, в первой части значения уникальны. Почему речь идет о "подстроке"? Для "mayton" будет ли "ton" являться подстрокой в данной имплементации алгоритма? Идет речь именно о начале строк, т.е. подстрока - это начало строки запроса запросы bass 40 base 30 blackbass 10 подстрока ba вывод: (в порядке убывания частоты запросов) bass 40 base 30 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 07:13 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
FabusВсе строки и не сортируются. TreeMap это сортированное дерево. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:04 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
FabusИдет речь именно о начале строк, т.е. подстрока - это начало строки запроса Совсем одно и то же по-вашему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:05 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
FabusПример входного файла: .... Fabus... Собственно говоря все работает... НО временные ограничения 2 сек, а у меня 8-12 сек.... Купить более быстрый компьютер )))), на приведенном входном файле: На моем AMD Atlon Код: java 1. 2. 3. 4. Fabusи узкое место именно эта сортировка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:12 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Посмотрел сортировку. Коллекция на коллекции, лямбда на лямбде... IMHO проще надо быть. И будет значительно проще понять, куда время уходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:13 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevКупить более быстрый компьютер )))), на приведенном входном файле: Подозреваю что он меряет не на своём компьютере и не на этом файле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:14 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Зачем там LinkedList когда ArrayList был бы ничем не хуже Зачем там LinkedHashMap мне вообще не понятно и так далее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:18 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Blazkowicz...и не на этом файле.... Я так же думаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:18 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Меня смущает что подстроки с какой-то радости в конце файла. Потому как именно подстроки стоит держать в памяти, а не все "запросы", которые можно обработать построчно. Я бы перемотал, на подстроки и вычитал их все в Map<SubString, LimitedSortedSet<MeasuredString>>. А потом уже итерировался бы по "запросам", один раз, формируя результат. Хм. Правда это будет экономия на памяти. А для производительности нужно читать сначала вычитать таки все запрсы в структуру оптимизированную для поиска по подстроке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:21 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Вот простой пример на массиве который http://www.programcreek.com/2014/05/leetcode-implement-trie-prefix-tree-java/ сделай такую же структуру, только добавь переменную для хранения веса запроса. Сложи все запросы в неё. Затем для каждой подстроки будет быстрый поиск подходящих запросов. Основные затраты будет в заполнении Trie. С другой стороны, всё равно должно быть эффективнее собрать Trie из "подстрок", так как их меньше. А потом уже обходит это небольше Trie читая запросы. Такая структура, ведь, на много меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:33 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Разница во времени по nanoTime() orig=2999402 fast=791147 orig=44069 fast=12591 orig=22184 fast=7195 orig=17387 fast=5696 orig=17388 fast=5696 orig=11692 fast=6896 orig=26681 fast=5396 orig=19786 fast=5396 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:50 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevРазница во времени по nanoTime() Да-да. LinkedList зло. Выкинуть в первую очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:11 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Очень жаль что такую замечательную поисковую структуру данных RTrie не включили в состав JDK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 16:46 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, задачу решил, небольшая оптимизация кода помогла. файл с кодом и генератором прикрепил, вдруг кому понадобится. Кстати при реализация с Trie так и не получилось влезть в рамки 100 Мб. Ну да и ладно. Еще раз всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 06:50 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
FabusВсем спасибо, задачу решил, небольшая оптимизация кода помогла. Молодец что поделился деталями и рассказал всем в чем же было дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 08:39 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
Нужно создать отдельный топик для разбора такого рода задач ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 10:20 |
|
||
|
Помогите ускорить работу кода
|
|||
|---|---|---|---|
|
#18+
FabusМожно ли ускорить сортировку (писать их в отдельные потоки/нити, или делать частичную сортировку, правда не знаю пока как)? бинарная куча по убыванию из необходимого количества элементов Z - O(Ln(Z) * N) ЗЫ: Код: java 1. загрузил бы просто в обычный список (масив) да отсортировал его, быстрее будет чем в дерево добавлять диапазон с префиксом бинарным поиском найдёшь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 10:53 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39461190&tid=2122889]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 412ms |

| 0 / 0 |
