powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите ускорить работу кода
25 сообщений из 25, страница 1 из 1
Помогите ускорить работу кода
    #39459132
Fabus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем! Помогите с задачкой.
Необходимо реализовать функцию подбора наиболее часто встречающихся запросов по частично введенной строке.

Есть файл с входными значениями формата (строка пробел число), кол-во таких значений не более 10 5
в этом же файле есть набор подстрок в формате (строка), таких значений не более 15000

Необходимо для каждой подстроки вывести в выходной файл 10 наиболее часто встречающихся строк (запросов из первой части файла).

Алгоритм следующий:
читаю все строки и числа в TreeMap<String, Integer> map
читаю все подстроки в ArrayList<String> list

Для каждой подстроки нахожу совпадения map.subMap()
Полученный Map сортирую по значению и пишу в файл 10 самых часто встречающихся запросов

Собственно говоря все работает... НО временные ограничения 2 сек, а у меня 8-12 сек. и узкое место именно эта сортировка.
Вопрос вот в чем:
Может быть я принципиально что-то не так делаю?
Можно ли ускорить сортировку (писать их в отдельные потоки/нити, или делать частичную сортировку, правда не знаю пока как)?

Файл с кодом во вложении.
Заранее спасибо за любые ответы.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459133
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
acmp.ru опять что ли?
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459139
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fabus,

Пример входного файла есть? Что за число? Количество сколько раз встречается строка?

В подобных случаях нет смысла всё грузить в память и сортировать. Нужно при чтении формировать результат.
Зачем сортировать вообще все строки, если сортировать нужно только те, которые относятся к подстроке?
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459200
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понятно задание.

Может быть такой входной файл?

Input:

Код: java
1.
2.
3.
4.
5.
6.
7.
        3
        mayton 1
        Fabus 2
        Blashkovich 3
        2
        m
        B



Могут ли быть дубликаты ключей в первой части?

Почему речь идет о "подстроке"? Для "mayton" будет ли "ton" являться подстрокой в данной имплементации алгоритма?

Почему outMap декларирован как HashMap? Это не соответствует смыслу возвращаемого результата subMap.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459243
Fabus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример входного файла:
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

ответ на каждую подстроку разделяем пустой строкой.
если частота встечаемости одинакова, выводим в алфавитном порядке
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459244
Fabus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, походу да.... был там давно-давно..
спасибо за наводку.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459246
Fabus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
Все строки и не сортируются.
сначала выделяются совпадения подстроки в запросах, и уже затем полученный Map сортируется по Value для выделения наиболее часто встречаемых запросов.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459257
Fabus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

3
mayton 1
Fabus 2
Blashkovich 3
2
m
B


Могут ли быть дубликаты ключей в первой части?
Нет, в первой части значения уникальны.

Почему речь идет о "подстроке"? Для "mayton" будет ли "ton" являться подстрокой в данной имплементации алгоритма?
Идет речь именно о начале строк, т.е. подстрока - это начало строки запроса
запросы
bass 40
base 30
blackbass 10

подстрока
ba

вывод: (в порядке убывания частоты запросов)
bass 40
base 30
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459295
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FabusВсе строки и не сортируются.

TreeMap это сортированное дерево.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459296
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FabusИдет речь именно о начале строк, т.е. подстрока - это начало строки запроса

Совсем одно и то же по-вашему?
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459299
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FabusПример входного файла:
....

Fabus...
Собственно говоря все работает... НО временные ограничения 2 сек, а у меня 8-12 сек....

Купить более быстрый компьютер )))), на приведенном входном файле:
На моем AMD Atlon
Код: java
1.
2.
3.
4.
Total time, ms 1
memory 1 mb
Total time, ms 7
memory 1 mb 0



Fabusи узкое место именно эта сортировка.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459300
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел сортировку.
Коллекция на коллекции, лямбда на лямбде...
IMHO проще надо быть. И будет значительно проще понять, куда время уходит.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459301
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevКупить более быстрый компьютер )))), на приведенном входном файле:

Подозреваю что он меряет не на своём компьютере и не на этом файле.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459305
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем там LinkedList когда ArrayList был бы ничем не хуже
Зачем там LinkedHashMap мне вообще не понятно
и так далее
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459306
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz...и не на этом файле....
Я так же думаю
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459310
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня смущает что подстроки с какой-то радости в конце файла. Потому как именно подстроки стоит держать в памяти, а не все "запросы", которые можно обработать построчно.
Я бы перемотал, на подстроки и вычитал их все в Map<SubString, LimitedSortedSet<MeasuredString>>.
А потом уже итерировался бы по "запросам", один раз, формируя результат.

Хм. Правда это будет экономия на памяти. А для производительности нужно читать сначала вычитать таки все запрсы в структуру оптимизированную для поиска по подстроке.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459312
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459316
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот простой пример на массиве который
http://www.programcreek.com/2014/05/leetcode-implement-trie-prefix-tree-java/
сделай такую же структуру, только добавь переменную для хранения веса запроса.
Сложи все запросы в неё.
Затем для каждой подстроки будет быстрый поиск подходящих запросов. Основные затраты будет в заполнении Trie.

С другой стороны, всё равно должно быть эффективнее собрать Trie из "подстрок", так как их меньше. А потом уже обходит это небольше Trie читая запросы. Такая структура, ведь, на много меньше.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459334
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    public static <K,V extends Comparable<? super V>> List<Map.Entry<K,V>> sortByValue_ArrayList( Map<K,V> map )  {
        ArrayList<Map.Entry<K, V>> list = new ArrayList<Map.Entry<K, V>>( map.size() );
        list.addAll( map.entrySet() );
        list.sort(
        	new Comparator<Map.Entry<K, V>>() {
        		public int compare(Entry<K, V> o1, Entry<K, V> o2) {
        			return (o2.getValue()).compareTo(o1.getValue());
        		}
        	}
        );
        return list;
    }


Разница во времени по 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

...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459370
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevРазница во времени по nanoTime()

Да-да. LinkedList зло. Выкинуть в первую очередь.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39459842
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень жаль что такую замечательную поисковую структуру данных RTrie не включили в состав JDK.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39461190
Fabus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, задачу решил, небольшая оптимизация кода помогла.
файл с кодом и генератором прикрепил, вдруг кому понадобится.
Кстати при реализация с Trie так и не получилось влезть в рамки 100 Мб. Ну да и ладно.
Еще раз всем спасибо.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39461224
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FabusВсем спасибо, задачу решил, небольшая оптимизация кода помогла.
Молодец что поделился деталями и рассказал всем в чем же было дело.
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39461296
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно создать отдельный топик для разбора такого рода задач
...
Рейтинг: 0 / 0
Помогите ускорить работу кода
    #39461325
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FabusМожно ли ускорить сортировку (писать их в отдельные потоки/нити, или делать частичную сортировку, правда не знаю пока как)?
бинарная куча по убыванию из необходимого количества элементов Z - O(Ln(Z) * N)


ЗЫ:

Код: java
1.
SortedMap<String, Integer> map = new TreeMap<>();


загрузил бы просто в обычный список (масив) да отсортировал его, быстрее будет чем в дерево добавлять
диапазон с префиксом бинарным поиском найдёшь
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите ускорить работу кода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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