|
12 / 12 / 5
Регистрация: 16.03.2010
Сообщений: 37
|
|
Предподсчет и поиск за одну секунду12.05.2015, 19:46. Показов 4106. Ответов 13
Метки нет (Все метки)
Здравствуйте!
Поставлена такая задача: имеется массив из 100,000 пар "строка - число". Все строки уникальные, числа могут повторяться. Даётся 1 секунда на создание вспомогательных структур и предподсчет будущих результатов. После этого следует 100,000 запросов, в каждом из которых выполняется поиск 10 таких пар, что: строка начинается с указного префикса, а число как можно больше. Выполнение всех этих запросов должно уложиться ещё в 1 секунду! И ещё одно неприятное ограничение: используемая память ограничена 64 мб. Подскажите, какие структуры можно использовать для решения? Префиксное дерево (первое, что пришло в голову) уже безо всяких предподсчетов не укладывается в 64 мб. AVL-дерево по памяти проходит, но на выполнение одного запроса уходит (в среднем) 5 мс - слишком медленно. Подскажите ещё варианты?
0
|
|
| 12.05.2015, 19:46 | |
|
Ответы с готовыми решениями:
13
Задержка в одну секунду Максимум 3 запроса за одну секунду.
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|
| 12.05.2015, 22:15 | |
|
Какого размера числа?
Какой длины строки? Добавлено через 1 час 3 минуты Какие символы могут встречаться в строках?
1
|
|
|
12 / 12 / 5
Регистрация: 16.03.2010
Сообщений: 37
|
|
| 13.05.2015, 15:08 [ТС] | |
|
Числа - long, по 8 байт каждое. Строки - не более 32 символов в unicode, только буквы и цифры. Итого 72 байта на одну пару, ~7 мб на все данные.
Опыты показали, что при таких условиях количество узлов в префиксном дереве приближается к 3 миллионам, то есть построить его целиком не выйдет - не хватит памяти. Сейчас рассматриваю такой вариант: префиксное дерево для первых 8 символов (займет около 50 мб), дальше обычное дерево или даже просто список. Но быстро работать это будет только из расчета, что лишь несколько строк начинаются с 8 одинаковых символов. Да и, честно говоря, пока слабо представляю, как это всё написать. Ещё не указал одну деталь: реализовываться будет на Java.
0
|
|
|
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
|
|
| 13.05.2015, 15:52 | |
|
можно закинуть хеши всех префиксов в std:map<long long, int> - МАП из хеша префикса в макс число. ну и потом когда пришел запрос мы просто считаем хеш строки-запроса и берем значение из МАПЫ.
0
|
|
|
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
|
|
| 13.05.2015, 16:25 | |
|
krapotkin, не понял вопроса. вот есть строка S и соответствующее ей значение VAL. мы посчитаем хеши всех префкисов строки и все эти хеши закинем в МАП так: MAP[hash[i]] = max(MAP[hash[i], VAL); теперь когда пришел запрос строка мы считаем ее хеш. пусть он равен needHASH и тогда ответ на запрос равен MAP[needHASH].
Добавлено через 2 минуты Dozer74, кстати откуда задача. чет она больно олимпиадная да еще и ограничения откуда то взялись. может соревнование какое идет?
0
|
|
|
|
|
| 13.05.2015, 16:27 | |
|
в задании сказано
10 таких пар, что: строка начинается с указного префикса, а число как можно больше если префиксы фиксированной длины, то вполне можно эффективный индекс построить я просто не знаю, как хэши реализованы в яве
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|||||||||||
| 13.05.2015, 22:53 | |||||||||||
|
В качестве ключей я создаю случайным образом 100 тыс. строк по таким параметрам:
Время на построение меньше 0.5сек. Случайным образом строю 100 тыс запросов. Выполняю все запросы. Общее время меньше 0.05сек. Добавлено через 4 минуты Описание дерева: Добавлено через 9 минут Мне лень было самому двоичный поиск в отсортированном массиве писать , поэтому я использую SortedList<char, int>:SortedList<TKey, TValue> is implemented as an array of key/value pairs, sorted by the key. The SortedList<TKey, TValue> generic class is an array of key/value pairs with O(log n) retrieval. Так выглядит узел дерева:
Добавлено через 8 минут Алгоритм построения дерева: 1. Сортируем данные по ключу (строке). 2. Для каждой строки данных: Пока префикс ключа совпадает с префиксом предыдущего: идём по дереву, обновляя, если нужно число. Добавляем узел с текущим символом ключа. Пока префикс не станет отличаться от префикса следующего: добавляем узел с текущим символом. Добавлено через 5 часов 42 минуты Запускал я только дебаг версию (без оптимизации). С оптимизацией немного быстрее получается. Я переписал с использования SortedList на обычный List (обычный массив с логикой для автоматического увеличения размера). Так как массивы у меня маленькие, то линейный поиск не сильно медленней получается. А вот с памятью сложнее. Для оптимизации по памяти нужно свой менеджер памяти писать, а мне лень (массивы по ходу работы нужно переаллоциловать - значит за "дырками" следить и т.д.). Потом каждый экземпляр класса - это дополнительный расход памяти. Класс нужно на структуру заменять, а в C# нельзя структуру из функции по ссылке вернуть... значит код переписывать. Сейчас по памяти я укладываюсь с большим запасом... но это на случайных данных. Неизвестно, что будет, если специально конструировать данные, которые потребуют максимума памяти. Сейчас время примерно такое: Generate tree: max = 100000, time = 00.0771723 Memory used: 43,56 Mb Find: max = 100000, time = 00.0589016 Добавлено через 3 минуты Расход памяти - это то, что процесс под себя забирает. Я из под LinqPad запускал... там даже при n = 10 сразу 32 Mb... Добавлено через 4 минуты С линейным поиском в два раза медленнее ищется, но запас есть.
0
|
|||||||||||
| 14.05.2015, 08:26 | |
|
Не понял что здесь дает дерево если оно строится по одному ключу (строка). Просто отсортированный массив и линейный поиск в диапазоне lower_bound/upper_bound даст ту же скорость. Если все строки начинаются c заданного префикса - увы, дело сведется к линейному перебору.
Заменим строку на "тоже число", получаем задачу: найти точку (x, y) с максимальным y и x в заданном диапазоне значений. Здесь хорошо подходит напр BSP, AABB - т.е. задача сводится к хорошо известной. Просто это замаскировано "строкой" (и ловушка сработала )
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||
| 14.05.2015, 11:28 | ||
|
Вот исходные данные и дерево, которое я строю: (на синие числа не обращайте внимания - их линкпад добавляет при выводе.
0
|
||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||
| 14.05.2015, 14:07 | ||
|
Добавлено через 4 минуты На картинке видны ответы (максимальные числа) для всех префиксов: Кликните здесь для просмотра всего текста
a 9930
ab 740 ac 9930 aca 7820 acac 7820 acaca 545 acacb 7820 acb 1596 acc 9930 accb 9930 и так далее
1
|
||
| 14.05.2015, 14:33 | |
|
0
|
|
| 14.05.2015, 14:33 | |
|
Помогаю со студенческими работами здесь
14
Как задержать цикл на одну секунду
Добавить одну секунду к заданному времени
Определить время, на одну секунду больше заданного. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|