Russian Qt Forum
Сентябрь 21, 2024, 10:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Быстрый алгоритм поиска одинаковых строк  (Прочитано 38923 раз)
BRE
Гость
« Ответ #30 : Сентябрь 14, 2009, 16:08 »

однозначно алгоритм поразрядной сортировки.
+1
Думаю что линейный алгоритм с меньшим количеством проходов не оставит шансов двум проверенным алгоритмам.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Сентябрь 14, 2009, 17:06 »

Погонял тесты, посмотрел. Чтение и перевод из строки в число выполнял одинаковый код.
Предварительные результаты следующие:
При отсутствии совпадений по скорости выигрывает алгоритм с сортировкой, но с увеличением количества совпадающих строк (и увеличением количества попаданий в хеш) алгоритм с хешем  (использовался QHash) догоняет, а затем и перегоняет первый.
Все то же самое должно быть и по памяти. При небольшом числе совпадений сортировка съест в 3-4 раза меньше, но если все строки одинаковы... Улыбающийся Зато с сортировкой голова не болит "какие там данные"
Записан
BRE
Гость
« Ответ #32 : Сентябрь 14, 2009, 17:19 »

Все то же самое должно быть и по памяти. При небольшом числе совпадений сортировка съест в 3-4 раза меньше, но если все строки одинаковы... Улыбающийся Зато с сортировкой голова не болит "какие там данные"
Чем больше совпадений, тем меньше элементов будет храниться в хеше (тем меньше памяти понадобиться).
Для сортировки - не важно сколько будет повторов, все элементы будут загружены в память.
Записан
fa
Гость
« Ответ #33 : Сентябрь 14, 2009, 20:17 »

1) Правильно ли я понял, что строки не только фиксированной длины, но являются 16-чным представлением целых 32-битных чисел?
2) Правильно ли я понял, что  кол-во строк(чисел) гарантированно не превышает 1024*1024*256 = 67'108'864;
1-ое: верно.
2-ое: теоретически может быть и больше...

уточняю условия задачи.
берется файл абсолютно любого размера, для каждых его 128 байт считается значение контрольной суммы и записывается в файл. и теперь осуществляется поиск одинаковых строк в файле.
соответственно количество строк = размер файла / 128

Но я думаю поразрядная сортировка это оптимальный вариант, вряд ли наберется 67млн строк, к тому же есть вариант записывать при подсчете коллизий в 16 файлов, сортируя по первому символу...
заранее зная первый символ можно еще более увеличить скорость поиска =)
« Последнее редактирование: Сентябрь 14, 2009, 20:37 от fa » Записан
spectre71
Гость
« Ответ #34 : Сентябрь 14, 2009, 21:04 »

1) Правильно ли я понял, что строки не только фиксированной длины, но являются 16-чным представлением целых 32-битных чисел?
2) Правильно ли я понял, что  кол-во строк(чисел) гарантированно не превышает 1024*1024*256 = 67'108'864;
1-ое: верно.
2-ое: теоретически может быть и больше...

уточняю условия задачи.
берется файл абсолютно любого размера, для каждых его 128 байт считается значение контрольной суммы и записывается в файл. и теперь осуществляется поиск одинаковых строк в файле.
соответственно количество строк = размер файла / 128

Понятно.
Если не сложно, объясни почему именно по 128 байт, а не больше, что за задача?
Далее, сильно расписывать не буду, спать уже хочся Улыбающийся, если что непонятно потом спросишь.

1) Имеем файл с 32-рарядными числами в 16-чной текстовой записи. Каздое число на новой стоке.
  Вопрос! Ты формируешь файл? Если ты, то пиши без данные без прерноса строк, а лучше в бинарном виде, а не в 16-чной текстовой записи.
2) Читаем файл, лучше для скорости!!! не пользоваться QT-ми строками для чтения и преобразования данных, а читать в буфер, разбирать и преобразовывать самостоятельно.
3) Для сортировки будем использовать алгоритм поразрядной сортировки. Изучи это:
  a) http://www.codelab.ru/task/4
и это
  b) http://www.codelab.ru/task/5/
4) Нам оптимальнее всего выделить 2 разряда по 2 байта(high и low), соответственно при чтении каждого числа заполняем такой массив
qint16 order[2]; // order[0] - high; order[1] - low;
5) Если файл слишком большой, то читаем и сортируем "кусками", пишем отсортированные данные для каждого куска в свой файл, а затем объединяем за линейное время.
6) Размер выделяемой памяти под "кусок" тебе понадобится 256 KB(под счетчики) + 2*4*N байт, где N кол-во чисел для сортировки
7) 4*N байт - под массив N вышеописанных массовов(qint16 order[2])
8.) Еще 4*N, для копирования данных после сортировки по первому разряду(см. алгоритмы, тебе нужен будет (b))
Записан
fa
Гость
« Ответ #35 : Сентябрь 14, 2009, 21:25 »

Если не сложно, объясни почему именно по 128 байт, а не больше, что за задача?
Почему-то было решено сделать именно так. решал не я ))..
задача состоит в проверке эффективности алгоритмов вычисления контрольных сумм на основе статистики.
Записан
spectre71
Гость
« Ответ #36 : Сентябрь 14, 2009, 21:48 »

Если не сложно, объясни почему именно по 128 байт, а не больше, что за задача?
Почему-то было решено сделать именно так. решал не я ))..
задача состоит в проверке эффективности алгоритмов вычисления контрольных сумм на основе статистики.
Каких конкретно алгоритмов вычисления контрольных сумм?
Записан
fa
Гость
« Ответ #37 : Сентябрь 15, 2009, 10:13 »

Каких конкретно алгоритмов вычисления контрольных сумм?

А вот тут уже никакой конкретики, они приходят и уходят...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Сентябрь 15, 2009, 19:51 »

3) Для сортировки будем использовать алгоритм поразрядной сортировки. Изучи это:
  a) http://www.codelab.ru/task/4
и это
  b) http://www.codelab.ru/task/5/
Красивый алгоритм (и полезный сайт)
Памяти правда сожрет больше, ну так это "диалектика"  Улыбающийся
Записан
fa
Гость
« Ответ #39 : Сентябрь 16, 2009, 23:44 »

Цитировать
Красивый алгоритм (и полезный сайт)
Памяти правда сожрет больше, ну так это "диалектика"
больше, чем ... Непонимающий
Записан
spectre71
Гость
« Ответ #40 : Сентябрь 17, 2009, 10:45 »

Цитировать
Красивый алгоритм (и полезный сайт)
Памяти правда сожрет больше, ну так это "диалектика"
больше, чем ... Непонимающий
Например алгоритм quicksort не требует дополнительной памяти, т.е. требуется память только под сам массив сортируемых данных.
Алгоритм поразрядной сортировки(вторая ссылка из которых я  приводил), требует дополнительную память в размере исходного массива + еще немного для хранения счетчиков для разряда; - размер памяти под счетчики зависит от sizeof разряда, например если разряд берем 1 байт, то 256*4=1 KB, а если 2 байт, то 256*256*4=256 KB (на мой взгляд лучший вариант брать разряд 2 байт)
Записан
fa
Гость
« Ответ #41 : Сентябрь 17, 2009, 11:09 »

Цитировать
Например алгоритм quicksort не требует дополнительной памяти, т.е. требуется память только под сам массив сортируемых данных.
Алгоритм поразрядной сортировки(вторая ссылка из которых я  приводил), требует дополнительную память в размере исходного массива + еще немного для хранения счетчиков для разряда; - размер памяти под счетчики зависит от sizeof разряда, например если разряд берем 1 байт, то 256*4=1 KB, а если 2 байт, то 256*256*4=256 KB (на мой взгляд лучший вариант брать разряд 2 байт)
угу, спасибо =))
но это не страшно )..
Записан
garryHotDog
Гость
« Ответ #42 : Март 21, 2010, 21:22 »

для поиска подстроки в строке использовал "Алгорит БМХ (Боейра Мура Хорпсула)"...бытсро, просто, есть исходники...кому надо пишите
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #43 : Май 06, 2010, 10:45 »

Например алгоритм quicksort не требует дополнительной памяти, т.е. требуется память только под сам массив сортируемых данных.
Как это quicksort не требует? В лучшем случае O(log n) памяти нужно, в худшем O(n).
Записан
spectre71
Гость
« Ответ #44 : Май 07, 2010, 09:38 »

Например алгоритм quicksort не требует дополнительной памяти, т.е. требуется память только под сам массив сортируемых данных.
Как это quicksort не требует? В лучшем случае O(log n) памяти нужно, в худшем O(n).

Да, это так.
Но имелось ввиду выделение дополнительной памяти в куче.
Хотя quicksort можно сделать и без рекурсии, тогда неюбходимо эмулировать стек и выделять память в куче.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.199 секунд. Запросов: 23.