Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Программирование —› Быстрый поиск по файлу
Посл.ответ Сообщение

Ранг: 46.9 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 29 июля 2007 00:15
· Личное сообщение · #1

Есть файл вида :
449A36B6689D841D7D27F31B4B7CC73A=aaron
187EF4436122D1CC2F40DC2B92F0EBA0=ab
F740458218F30210F39A389B50287B07=aback
13F27B1072BBF7719D0D267B083FF91C=abacus
0ED4E356DDBE2FBF3D35D4AB1F31DE69=abase
623A150615F470135FF20B735C3F24FB=abash
0CD2269E449DEC70464BD16E373FCFE5=abate
AB3358313EFB03210A1BABFB372246F1=abbey

Размеров гига 2 нужно быстро произвести по нему поиск,кто может предложить какие алгоритмы буду оч благодарен




Ранг: 467.7 (мудрец), 5thx
Активность: 0.270
Статус: Участник
Иной :)

Создано: 29 июля 2007 00:28 · Поправил: [HEX]
· Личное сообщение · #2

Zloy
а в БД нормальную один раз перевести никак? Или обязательно в файле искать? Если по файлу искать, то быстро наврятли получиться я думаю все зависеть будет от винта (как быстро он сумеет читать строки). Либо блоками читать в оперативу и искать уже в оперативе.

-----
Computer Security Laboratory




Ранг: 46.9 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 29 июля 2007 00:33 · Поправил: Zloy
· Личное сообщение · #3

Объясняю вкратце. Имеем структуру вида pass:hash, по 16 байт. итого 32.
узнаем количество записей из размера базы. Пусть будет b.
левая граница a=0, правая граница b
открываем базу, упорядоченную по хэшам. Читаем запись из середины (a+b)/2. Если прочтенный хэш больше(как строка), то выбираем первую половину этого куска. т.е. сдвигаем правую границу на x, а если меньше - то левую на x.
Устанавливаем x на (a+b)/2. Повторяем, пока не найдем результат, либо когда поймем, что нет записей.


Тут чел вот написал мне,тока я чота непонялмож я тупой но без примера тут мне никак



Ранг: 52.1 (постоянный), 1thx
Активность: 0.020
Статус: Участник

Создано: 29 июля 2007 04:38
· Личное сообщение · #4

Поддерживаю предыдущего участника, только достаточно даже не польной сортировки, а еще проще - у Вас поиск и соответственно сортировака по хешам, т.е. один символ это либо цифра от 0 до 9, либо буква от a до f, всего 16 вариантов, Вы можете создать 16 списков и пройтись по исходному файлу, добавляя строки в список с сименем, с которого начинается хеш текущей строки. Периодически списки можно скидывать в файл и очищать, потом опять скидывать в режиме 'дописывания', чтобы не загружать оперативу. Потом все эти файлы склеить в единый.

Получается сортировка по первым символам, она на порядок быстрее полной сортировки и использует намного меньше перемещений памяти.

Для поиска Вам нужно найти номера строк, с которой начинается новый символ, это можно сделать прохожом по файлу, пропуская 1/16 числа строк, после гаждого шага, если после первого прохода все 16 строк, с которых начинается новые символы, весь алфавит не найден - искать уже между найденными с меньшим пропуском.

Эту информацию (о строках с новыми символами в хеше) можно сохранить в отдельный файл - кеш, и начинать поиск с нужного смещения. В итоге поиск будет в 16 раз быстрее исходного, в то же время индексация намного быстрее полной сортировки и, самое главное, не столь критична к памяти. Я этот метод использую регулярно.

Одна только проблема, актуальная и для моего метода и для полной сортировки - если в этот файл планируется постоянное добавление новых данных поиск будет весьма затруднительным, разве что скидывать новые данные в отдельный файл, пока его размер не привысит какой-то величины, а когда привысит - производть объединение и реиндексацию. Хотя тучшим вариантом было бы использование БД.



Ранг: 56.3 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 29 июля 2007 07:49
· Личное сообщение · #5

Что именно искать в файле надо?




Ранг: 199.9 (ветеран), 4thx
Активность: 0.120.02
Статус: Участник

Создано: 29 июля 2007 08:19
· Личное сообщение · #6

Zloy пишет:
Тут чел вот написал мне,тока я чота непонял

Чел раписал тебе алгоритм поиска по упорядоченной по индексу базе данных. Это будет работать только если записи в файле ранжированы определенным образом. На пальцах: если, например, в файле есть нумерация строк: 1,2,3,4,5..10000 и нужно найти строку, скажем 550, то оптимальным алгоритмом будет такой: ставим указатель на середину файла - строку 500 и сравниваем: у нас больше (550>500), поэтому перемещаем указатель на середину второй половины файла - 750 и снова ссраниваем и т.д. Таким образом число итераций поиска всегда будет минимальным.
Если записи в файле не упорчдочены - то чтение блоками через BlockRead и поиск нужного в прочитанном блоке.




Ранг: 103.3 (ветеран), 8thx
Активность: 0.060
Статус: Участник

Создано: 29 июля 2007 10:22 · Поправил: NaumLeNet
· Личное сообщение · #7

[delete]




Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 30 июля 2007 07:27
· Личное сообщение · #8

Zloy пишет:
какие алгоритмы

Любые варианты BM.


aeee_29.07.2007_CRACKLAB.rU.tgz - Boyer-Moor searching algorithm.rar



Ранг: 51.0 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 30 июля 2007 10:06
· Личное сообщение · #9

Zloy пишет:
449A36B6689D841D7D27F31B4B7CC73A=aaron
187EF4436122D1CC2F40DC2B92F0EBA0=ab
F740458218F30210F39A389B50287B07=aback
13F27B1072BBF7719D0D267B083FF91C=abacus
0ED4E356DDBE2FBF3D35D4AB1F31DE69=abase
623A150615F470135FF20B735C3F24FB=abash
0CD2269E449DEC70464BD16E373FCFE5=abate
AB3358313EFB03210A1BABFB372246F1=abbey

надо ли понимать, что присутствует некая отсортированность по второму столбцу? тогда классический бинарный поиск. поищи в инете binary search.




Ранг: 103.3 (ветеран), 8thx
Активность: 0.060
Статус: Участник

Создано: 30 июля 2007 16:20
· Личное сообщение · #10

напоминает rainbow tables. может ТС стоит смотреть именно в их сторону?


 eXeL@B —› Программирование —› Быстрый поиск по файлу
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати