Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарный поиск 
V
    Опции темы
sprinterv
Дата 24.12.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 29.8.2008

Репутация: нет
Всего: нет



абракадабра

Это сообщение отредактировал(а) sprinterv - 27.1.2009, 13:33
PM MAIL   Вверх
Earnest
Дата 24.12.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Раз строки имеют переменную длину, то без предварительного индексирования не обойтись. Нужно просканировать файл один раз и собрать, как минимум, позиции начала записей. Но требуемый объем памяти уже будет зависеть от размера файла. Нет, конечно можно лезть в любое место файла наугад и искать ближайший конец записи (0A), но криво это жутко...


--------------------
...
PM   Вверх
maxdiver
Дата 24.12.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Цитата
Раз строки имеют переменную длину, то без предварительного индексирования не обойтись. Нужно просканировать файл один раз и собрать, как минимум, позиции начала записей. Но требуемый объем памяти уже будет зависеть от размера файла. Нет, конечно можно лезть в любое место файла наугад и искать ближайший конец записи (0A), но криво это жутко...

Почему же криво? Во-первых, иначе нужна будет память дополнительная память для хранения начал, что не удовлетворяет условию.
А так - ну вот есть у нас два указателя в файле (l;r), указывающие на начала записей, находящихся в текущем рассмотрении. Берём середину m=(l+r)/2 и идём от неё влево, пока не встретим начало блока. Если мы пришли в позицию l, и окажется, что всё-таки l надо включать в отрезок поиска, то надо подвигать l вправо до начала следующего блока (с асимптотикой всё будет ок, у нас же один этот l-ый блок такую длину имеет, что она больше (l+r)/2). А иначе, если текущий случай - не этот особый, то вообще стандартный бинпоиск.
PM MAIL WWW ICQ   Вверх
Akina
Дата 25.12.2008, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Earnest @  24.12.2008,  18:41 Найти цитируемый пост)
Раз строки имеют переменную длину, то без предварительного индексирования не обойтись. 

Это не так. Делим файл на логические блоки. Размер каждого блока не менее двухх максимальных длин записи. Это гарантирует, что вне зависимости от того, откуда мы возьмём такой блок, в нём будет минимум одна полная запись. После чего собсно бинарным поиском ищем БЛОК, в которых находится требуемая запись. На каждом шаге сужается тот кусок файла, в котором ищется нужная запись (отбрасывается чуть менее половины куска с предыдущего шага).

Т.е. для файла в 10 Г и записей по 4к читаем сперва 8к, начиная со смещения 5Г, находим в этом блоке начало первой полной записи (сразу после первого разделителя), экстрагируем ключ и сравниваем. Если больше, то на следующем шаге надо искать в диапазоне смещений 0 - 5Г+4к, если меньше - в диапазоне смещений 5Г - 10Г... можно посчитать, что потребное количество чтений 8-килобайтных блоков не превышает 21, и то при условии что на очередном шаге нам случайно не подвернётся нужный ключ (вероятность чего, кстати, не такая уж и маленькая)... и если на это потребуется 5 секунд, то просто комп надо менять, хотя бы на второй пенёк.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sprinterv
Дата 25.12.2008, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 29.8.2008

Репутация: нет
Всего: нет



Abrakadabra

Это сообщение отредактировал(а) sprinterv - 30.1.2009, 14:21
PM MAIL   Вверх
gcc
Дата 22.1.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17




sprinterv, а файл Ваш был 10 Гбт? как тогда быть с индексами? smile 

Это сообщение отредактировал(а) gcc - 22.1.2009, 17:09
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 27.1.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



задание которое автор удалил тут  smile (по непонятным причинам)
http://unixforum.org.ua/index.php?topic=18004

Добавлено через 2 минуты и 21 секунду
собсьвенно и ответ там же почти будет скоро  smile  smile  smile 

Это сообщение отредактировал(а) gcc - 27.1.2009, 17:48
PM WWW ICQ Skype GTalk Jabber   Вверх
djars
Дата 30.1.2009, 12:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 30.1.2009

Репутация: нет
Всего: нет



Цитата(gcc @  27.1.2009,  17:47 Найти цитируемый пост)
задание которое автор удалил тут  smile (по непонятным причинам)


вполне понятные smile
это тестовое задание на вакансию в рекламапорт
http://rabota.ua/company490967/vacancy4318883

Кое кто решил сэкономить свое время smile Только вот работать кто за него будет непонятно


Это сообщение отредактировал(а) djars - 30.1.2009, 12:47
PM MAIL   Вверх
sprinterv
Дата 30.1.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 29.8.2008

Репутация: нет
Всего: нет



 smile 
PM MAIL   Вверх
gcc
Дата 30.1.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



мне мужики задали это, это скорее всего не задание а "быдло-задание" с первого раза не понятно, я не на пи-ах-пи делал
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.