![]() |
|
|
![]()
|
|
| sprinterv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 29.8.2008 Репутация: нет Всего: нет |
абракадабра
Это сообщение отредактировал(а) sprinterv - 27.1.2009, 13:33 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Раз строки имеют переменную длину, то без предварительного индексирования не обойтись. Нужно просканировать файл один раз и собрать, как минимум, позиции начала записей. Но требуемый объем памяти уже будет зависеть от размера файла. Нет, конечно можно лезть в любое место файла наугад и искать ближайший конец записи (0A), но криво это жутко...
-------------------- ... |
|||
|
||||
| maxdiver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
Почему же криво? Во-первых, иначе нужна будет память дополнительная память для хранения начал, что не удовлетворяет условию. А так - ну вот есть у нас два указателя в файле (l;r), указывающие на начала записей, находящихся в текущем рассмотрении. Берём середину m=(l+r)/2 и идём от неё влево, пока не встретим начало блока. Если мы пришли в позицию l, и окажется, что всё-таки l надо включать в отрезок поиска, то надо подвигать l вправо до начала следующего блока (с асимптотикой всё будет ок, у нас же один этот l-ый блок такую длину имеет, что она больше (l+r)/2). А иначе, если текущий случай - не этот особый, то вообще стандартный бинпоиск. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Это не так. Делим файл на логические блоки. Размер каждого блока не менее двухх максимальных длин записи. Это гарантирует, что вне зависимости от того, откуда мы возьмём такой блок, в нём будет минимум одна полная запись. После чего собсно бинарным поиском ищем БЛОК, в которых находится требуемая запись. На каждом шаге сужается тот кусок файла, в котором ищется нужная запись (отбрасывается чуть менее половины куска с предыдущего шага). Т.е. для файла в 10 Г и записей по 4к читаем сперва 8к, начиная со смещения 5Г, находим в этом блоке начало первой полной записи (сразу после первого разделителя), экстрагируем ключ и сравниваем. Если больше, то на следующем шаге надо искать в диапазоне смещений 0 - 5Г+4к, если меньше - в диапазоне смещений 5Г - 10Г... можно посчитать, что потребное количество чтений 8-килобайтных блоков не превышает 21, и то при условии что на очередном шаге нам случайно не подвернётся нужный ключ (вероятность чего, кстати, не такая уж и маленькая)... и если на это потребуется 5 секунд, то просто комп надо менять, хотя бы на второй пенёк. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| sprinterv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 29.8.2008 Репутация: нет Всего: нет |
Abrakadabra
Это сообщение отредактировал(а) sprinterv - 30.1.2009, 14:21 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
sprinterv, а файл Ваш был 10 Гбт? как тогда быть с индексами? Это сообщение отредактировал(а) gcc - 22.1.2009, 17:09 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
задание которое автор удалил тут
http://unixforum.org.ua/index.php?topic=18004 Добавлено через 2 минуты и 21 секунду собсьвенно и ответ там же почти будет скоро Это сообщение отредактировал(а) gcc - 27.1.2009, 17:48 |
|||
|
||||
| djars |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 30.1.2009 Репутация: нет Всего: нет |
вполне понятные это тестовое задание на вакансию в рекламапорт http://rabota.ua/company490967/vacancy4318883 Кое кто решил сэкономить свое время Это сообщение отредактировал(а) djars - 30.1.2009, 12:47 |
|||
|
||||
| sprinterv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 29.8.2008 Репутация: нет Всего: нет |
|
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
мне мужики задали это, это скорее всего не задание а "быдло-задание" с первого раза не понятно, я не на пи-ах-пи делал
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |