bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 09/09/04 в 15:51
|
|
есть несколько массивов (для примера: 10 текстовых файлов). обьем каждого массива 100мб.
нужно найти все строки которые встречается в 5ти (или более) из 10 массивов, чаще чем 3 раза в каждом.
тупой перебор - займет неделю с лишним. Пробовал отфильтровывать все что заведомо не будет отвечать условиям (т.е. для каждой базы данных убирать все строки которые встречаются менее 3-х раз)... скорость выросла но раза в полтора всего навсего. Потом попробовал разбить каждую базу на более мелкие (типа индекса по первым буквам сделал) скорость увеличилась раза в 2, но все равно на поиск уйдет несколько дней.
Вопрос, как еще можно оптимизировать это дело ? Интересует сам алгоритм (а не варианты с использованием баз данных типа майСКЛ)
И вообще, может кто нить подскажет какие нибудь книги типа "создание баз данных для чайников" , "поиск и индексирование информации для тупых".
Всем кто даст толковые идеи и информацию - рейтинг по максимуму ;)
|
K началу
|
|
|
bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 09/09/04 в 16:06
|
|
сорри не туда запостил  Модераторы, перенесите пожалуйста топик в "скрипты/програмирование". спасибо.
|
K началу
|
|
|
Wahoven
Зарегистрирован: 19.09.03
Сообщения: 1473
|
Добавлено: 09/09/04 в 16:06
|
|
Данные хранятся в текстовых файлах или уже получены в массивы? Варианты работы с данными разные - субд,файлы,память. Если действительно в файлах, то гораздо проще портировать эти данные в любую субд, вычистить ненужное и все маневры произодить там.
Оптимизация алгоритмов - это уже есть там, только не тупить с запросами и все будет работать достаточно быстро.
А эту операцию нужно производить периодически или однократно?
|
K началу
|
|
|
bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 09/09/04 в 16:19
|
|
данные храняться в оптимизированных текстовых файлах. т.е. у меня вместо СУБД - файловая система выступает (первые буквы каждой строки - имя папки к примеру).
в память такие массивы не запихнешь - там за несколько гигов в итоге база данных получится.
операцию надо будет производить каждые 10 часов примерно, и соответственно хотелось бы чтобы процесс обработки данных занимал не больше часа 
вариант с субд конечно наиболее грамотный и простой.., но хочеться все таки сами алгоритмы узнать !!! ибо мне в голову кроме создания индекса и уменеьшение обьема данных для каждого запроса (за счет выкидывания всех заведомо неподходящих вариантов) ничего в голову не пришло.
|
K началу
|
|
|
Wahoven
Зарегистрирован: 19.09.03
Сообщения: 1473
|
Добавлено: 09/09/04 в 16:56
|
|
А что за информация там хранится? В смысле насколько она систематизации поддается? И вот еще такой вопрос - информация же не может появлятся внезапно, она накапливается - может имеет смысл на этом шаге обработку вводить?
|
K началу
|
|
|
Alpha_Juno
Зарегистрирован: 30.06.03
Сообщения: 747
|
Добавлено: 09/09/04 в 18:04
|
|
В файлах те что по сто мегабайт какие символы есть помимо букв английских?
|
K началу
|
|
|
Alpha_Juno
Зарегистрирован: 30.06.03
Сообщения: 747
|
Добавлено: 09/09/04 в 18:05
|
|
Сколько времени займет построчное чтение каждого файла с созданием пустого файла, с именем прочтенной строки?
|
K началу
|
|
|
bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 09/09/04 в 18:43
|
|
в базе храняться всякие разные ссылки. знаки соответственно абсолютно все которые используеются в урлах... включая +;:&#~/... так что насчет создания файлов с именами = строке - не получится.
Wahoven писал: | информация же не может появлятся внезапно, она накапливается - может имеет смысл на этом шаге обработку вводить? |
предварительная обработка ведется, но там многопоточгая мультисерверная система, поэтому в итоге наступает момент когда все данные нужно обьединить и обработать вместе.
|
K началу
|
|
|
Andryxa
Зарегистрирован: 13.04.04
Сообщения: 133
|
Добавлено: 09/09/04 в 21:01
|
|
Есть такая превосходная книженция как "Структуры данных в С++" Уильям Топп и Уильям Форд Если хочешь сам писать всё, используй деревья (бинарные, AVL). Можно еще хеш-таблицу забубенить. Но тут как бы такая ситуация: тебе надо под эту таблицу отдельный файл ил несколько (а так как база большая, то имеет смысле делать хеш хешей); эм... как бы попроще, на один индекс выделяется определенное кол-во записей (по сути небольшое), то есть там само выделяется в зависимости от способа хеширования (схемы). Находишь индекс - и у тебя есть по сути прямой доступ на определенную позицию в файле (не надо читать весь файл "влоб"). На схеме деления у меня среднее время работы функции - 9нс, среднее кол-во коллизий - 16.72% (в идеале кол-во коллизий стремится к нулю), а максимальное кол-во коллизий - 33%. Это была самая быстрая функция у меня. Есть у меня программа, которая всё это дело тестирует (OspGen2), могу дать побаловаться ;)
|
K началу
|
|
|
bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 09/09/04 в 21:39
|
|
Andryxa, ок попробую поискать книгу.
а по советам.., терминологию понимаю с трудом... но в целом вроде похоже что у меня уже примерно так и сделано...
т.е. есть индекс индекса (первая буква строки - название папки), есть индекс (вторая буква - название файла), и есть типа логического дерева... (читать только один нужный файл до тех пор пока не найдено совпадение). Средний размер этих мелких файлов 2кб... т.е. по идее должно все работать очень быстро, но наделе - медленно 
да, для поиска в самих файлах я использую системный grep, стоит писать под это дело свою функцию или на скорости это не скажется ?
|
K началу
|
|
|
Andryxa
Зарегистрирован: 13.04.04
Сообщения: 133
|
Добавлено: 09/09/04 в 22:53
|
|
Конечно же сказывается на скорости. Лучше всего писать на ассемблере хеш-функцию и пихать ее в проект. Функция по схеме деления у меня работала за 9 наносекунд. НЕ поудмай, что здесь все так круто и работает быстро. Для начала надо найти оптимальные значение K для конкретного файла. То есть есть такие "математические аномалии", больше их никак не назовешь, когда с данной схемой лучше работают одни тексты, другие файлы - с другими схемами. Этих К надо перебирать туеву хучу, что при этом значении кол-во коллизий (одинаковых значений хеш-функции) было как можно меньше. Формула схемы деления: h(K)=K mod M, где М - т.н. модуль рассеяния (у нас по дефолту 1 или 2 байта, 255 и 65535 соотв. в зависимости от размера таблицы) При этом сгодится и несортированные файлы. Вот нашел это заветное К, и уже пихаешь его для вычисления значения хеш-функции. То бишь вычислив значение, ты прямиком попадаешь на небольшой блок, где можно искать напрямую, но лучше же опять извратиться в целях экономии, и сделать что-нить типа односвязного списка а может даже и бинарного дерева поиска.
Лучше ищи книгу, она толстенная, на... щас скажу, 800 страниц. Там довольно много интересного материала про поиск и выбор оптимальной структуры для данной ситуации. Короче, "Улыбок тебе дед мокар"
|
K началу
|
|
|
foma
Зарегистрирован: 10.05.04
Сообщения: 416
|
Добавлено: 09/09/04 в 22:59
|
|
Алгоритмом не помогу, а вот книгу могу посоветовать. Фундаментальный труд: Дональд Э. Кнут "Искусство программирования том 3 Сортировка и поиск"
|
K началу
|
|
|
Phoenix66
Зарегистрирован: 03.04.03
Сообщения: 574
|
Добавлено: 09/09/04 в 23:01
|
|
Че то я туплю видимо. В каком виде оно у тебя там таки храниться и какие размеры строк?
Лучше всего просто пример нескольких строк приведи.
Реально есть много вариантов. Но не видя что оно такое, нельзя понять где именно нужно сокращать размерность.
Судя по тому, что убирать все строки которые встречаются менее 3х раз тебе мало помогло, у тебя там подавляющее большинство строк встречается более 3х раз. Поэтому первое что ты делаешь - генеришь массив пар типа строка, количество повторов в этом массиве. Естественно выкидываешь все что меньше 3х раз. Ну или не пар, а просто массив строк, которые встречаются больше 3х раз, если тебя не ебет насколько чаще они встречаются там... Кстати, быстрее это делать не сканированием, а сортировкой методом "деления пополам". Правильного названия этого метода не помню. Суть в том что там массив пополам все время делится пока не дойдешь до 1 элемента, потом сливается обратно во столько же проходов, по идее более быстрого метода сортировки не существует. Если не знаешь и не понял, могу объяснить.
Дальше, если строки по 20-30 сиволов - может иметь смысл сгенерировать для них CRC например двухбайтные, ну или другую какую функцию использовать. Я так понимаю это и называется мудреным термином "хеш преобразование" о котором говорили выше. Потом сортируешь по возрастанию тем же методом. Естественно придется проиндексировать и сортировать вместе с индексом, иначе потом не поймешь где что было... Таким образом генеришь 10 массивов этой херни из начальных 10 файлов.
Потом делаешь вот что. Берешь и читаешь первое значение из каждого массива. Сравниваешь между собой. Если нашел равенство 5 значений - проверяешь исходные строки (ибо CRC у тебя могут быть одинаковыми у разных исходных строк). Если совпадают - ну записываешь куда надо и читаешь следующие значения по тем массивам, значения из которых совпали. Если равенства не было - смотришь какое из значений было минимальным и читаешь из того массива, из которого это минимальное было взято, следующее значение, остальные не трогаешь. Опять сравниваешь между собой и так далее. Вернее, читать можно сразу из нескольких массивов начиная с минимального значения, это уже смотря по тому, сколько текущих совпадает...
Примерно так. Может что напутал, но принцип надеюсь ясен...
Бля, вдруг понял что мне проще прогу написать, чем это объяснять.
|
K началу
|
|
|
Phoenix66
Зарегистрирован: 03.04.03
Сообщения: 574
|
Добавлено: 09/09/04 в 23:24
|
|
Бля, действительно туплю... Если первая стадия сортировкой была сделано, нахер потом мудрить с хешами не надо, и так скорость нормальная будет.
|
K началу
|
|
|
EXTRIM
Зарегистрирован: 15.10.02
Сообщения: 1729
|
Добавлено: 09/09/04 в 23:55
|
|
Переезжаем с скрипты..
|
K началу
|
|
|
Xrenoder
Зарегистрирован: 14.09.00
Сообщения: 637
|
Добавлено: 10/09/04 в 05:03
|
|
1. Переводишь все строки в CRC32 или CRC64 (соответственно, четырехбайтовое или восьмибайтовое число получается из каждой строки - зависит от того, какая надежность данных тебе нужна, но в целях ускорения лучше юзать разрядность, равную разрядности процессора)
2. Создаешь массив индексов из двух полей поле id - CRC строки (индекс) поле num - номер строки в исходном массиве.
без отслеживания повторений.
3. Сортируешь массив индексов быстрым алгоритмом (типа сортировки Хора)
4. Сжимаешь массив индексов с учетом повторений, выбрасывая строки которые встречаются в исходном массиве меньше чем 3 раза (это сделать легко, так как после сортировки идентичные CRC находятся рядом). При этом для каждого прошедшего критерий индекса в массиве индексов остается только 1 запись (а не 3 и более).
5. Повторяешь операцию для каждого из исходных массивов (если на юниксах работать будет, особенно на многопроцессорной машине, ускорить это дело можно, запустив обработку каждого массива в отдельном потоке).
6. Создаешь общий массив индексов из всех массивов индексов:
поле id - CRC строки (индекс) поле indnum - номер массива индексов. поле num - номер индекса в массиве индексов.
опять же без отслеживания повторений
7. Сортируешь.
8. Сжимаешь массив , выбрасывая индексы которые повторяются меньше чем 5 раз (это сделать опять же легко, так как после сортировки идентичные опять же CRC находятся рядом). При этом для каждого прошедшего критерий индекса в общем массиве индексов остается только 1 запись (а не 5 и более).
9. в итоге получаешь массив индексов строк со ссылками на массивы индексов, с которых можешь попасть на исходную строку, если надо.
Скоростные показатели: кроме сортировок (которых по числу массивов исходных + одна на общий массив индексов), все действия делаются в один проход.
При указаном тобой объеме это будет точно меньше часа
Скорее, минуты.
|
K началу
|
|
|
bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 10/09/04 в 08:26
|
|
Phoenix66 писал: | Суть в том что там массив пополам все время делится пока не дойдешь до 1 элемента, потом сливается обратно во столько же проходов, по идее более быстрого метода сортировки не существует. Если не знаешь и не понял, могу объяснить. |
не совсем понятно, так что лучше на примере пояснить. ;)
Xrenoder писал: | 3. Сортируешь массив индексов быстрым алгоритмом (типа сортировки Хора) |
а можно это также просто обьяснить как все предыдущее ? ;)
насчет CRC32 думал, но не стал делать потому что у меня там над массивом еще пара операций проводится при которых регулярные выражения используются... но смысл наверное все таки есть, так что попробую.
всем +8 к рейтингу
|
K началу
|
|
|
Andryxa
Зарегистрирован: 13.04.04
Сообщения: 133
|
Добавлено: 10/09/04 в 15:14
|
|
Hint: CRC - это одна из схем хеширования ;)
|
K началу
|
|
|
Andryxa
Зарегистрирован: 13.04.04
Сообщения: 133
|
Добавлено: 10/09/04 в 15:50
|
|
Phoenix66 писал: | Кстати, быстрее это делать не сканированием, а сортировкой методом "деления пополам". Правильного названия этого метода не помню. Суть в том что там массив пополам все время делится пока не дойдешь до 1 элемента, потом сливается обратно во столько же проходов, по идее более быстрого метода сортировки не существует. Если не знаешь и не понял, могу объяснить. |
Это "быстрая сортировка" (Charles Antony Richard Hoar). Используется рекурсия, можно без нее, но я предпочитаю рекурсию. Щас попробую найти, где-то у меня была программа на паскале, точнее функция. Суть такова: Берется массив, делится пополам (относительно какого-то элемента т.н. "точки разбиения"). Все элементы, меньшие или равные "точки разбиения", идут в одну сторону, а остальные - в другую. Затем каждый из этих массив опять делится поплам относительно уже своей "точки разбиения". И так далее, пока массив не будет отсортирован
Код: | void QuickSort(char *string, int count) //функция вызова ф-ции быстрой сортировки { qiuck(string, 0, count-1); }
void quick(char *string, int left, int right) //непосредственно функция { register int i,j; char x,y;
i=left; j=right;
x=string[(left+right)/2]; //выбор "точки разбиения" do { while((string[i]<x)&&(i<right)) i++; while((x<string[j])&&(j>left)) j--;
if(i<=j) { y=string[i]; string[i]=string[j]; string[j]=y; i++; j--; } }
if(left<j) quick(string, left, j); if(i<right) quick(string, i, right); }
|
Тока на С++. На паскале только сам ехе-шник нашел, а исходники где-то в дебрях валяются, не нашел. Ну я думаю, все из этой функции будет понятно, тут несложно вроде. Если нужна процедура быстрой сортировки строк, то скажи, нарисую.
|
K началу
|
|
|
Phoenix66
Зарегистрирован: 03.04.03
Сообщения: 574
|
Добавлено: 10/09/04 в 16:56
|
|
bog писал: | не совсем понятно, так что лучше на примере пояснить. ;)
|
Если ты поймешь как работает алгоритм сортировки, о котором я говорил, ты поймешь и как строки в разных массивах сравнить. Не уверен кстати, что это то же самое что Andryxa написал, у меня она вроде как-то иначе выглядела. Но это давно было, потом я не баловался этим, в си готовая функция есть qsort, которой надо только указатель на собственную функцию сравнения двух элементов передать (в смысле ей пох что сортировать - хоть числа хоть строки, надо правильно задать размер элемента и функцию сравнения), а все остальное там уже зашито.
Боюсь на примере это проблематично показывать. Я вижу это у себя в голове, но описать это не могу, но все же попробую.
Начнем с сортировки. Возьми 2 массива уже отсортированных по возрастанию:
1,3,5,9 и 2,6,8
1<2 ? да - пишем 1 3 < 2 ? нет - пишем 2 3 < 6 ? да - пишем 3 5 < 6 ? да - пишем 5 9 < 6 ? нет - пишем 6 9 < 8 ? нет - пишем 8 конец второго массива пишем 9 (и все что есть за ним, если бы оно было)
имеем 1,2,3,5,6,8,9
Вот так оно и работает. Это сортировка. Полный алгоритм может быть таки реализован по разному, можно бить до двоек, можно до троек, это уж кому как нравиться. Но проще всего, учитывая указанный выше пример, представить это так - если у тебя массив из 1000 элементов, ты условно разбиваешь его на 1000 массивов с одним элементом в каждом и потом сливаешь как описано выше по 2 в 12 проходов. Это довольно быстро на самом деле получается.
Когда отсортируешь в одном массиве строки - просто посравниваешь их друг за другом и выделишь уникальные, выкинув те, которые меньше трех раз встречаются.
Теперь перейдем к сравнению. Если ты представил как работает вышеприведенная фигня, ты легко сможешь представить и сравнение по такому же принципу не 2х, а 10 массивов, если они уже отсортированы по возрастанию.
Рассмотрим для простоты на 3х. Например мы ищем элемент, который есть во всех трех массивах.
1,3,5,8,9 1,2,4,5,7 2,3,4,5,6
1 = 1 < 2 - ясно что третий раз 1 уже не будет 100%, поэтому читаем следующие элементы из массивов #1 и #2
3 <> 2 <> 3 - тройка может еще встретиться в массиве #2 так как в нем минимальное значение, поэтому читаем из него следующее значение.
3 <> 4 <> 3 - пиздец, трех троек уже нет, читаем следующий элемент из #1 и #3, так как они меньше.
5 <> 4 = 4 - ясен пень, что трех четверок тоже не будет, читаем следующий из #2 и #3
5 = 5 = 5 - вуаля! найдено. записываем и читаем дальше из всех трех
8 <> 7 <> 6 - не равно, читаем из #2 и #3 - а там конец. Все, конец работы, три восьмерки нам не светят.
Вот примерно так. Весьма быстро. Учти только что если массивов будет 10 и надо искать то встречается в 5-ти, процесс будет сложнее. Потому что правила отсечения другие немного. Например если текущие значения 4 5 2 1 5 4 3 2 1 5 - у тебя еще может оказаться что встретится 5 раз пятерка, четверка и тройка, но уже точно не встретиться 5 раз единица и двойка, поэтому можно смело читать следующие элементы там где текущие равны 1 и 2, т.е продвигаешься на единичку сразу по 4м массивам. Короче, когда ищешь 5 совпадений - можно считывать следующий 1 элемент сразу для 4х массивов сразу, у которых текущие значения меньше (строго меньше) остальных, ибо точно уже ни одно из этих значений не будет 5 раз во всех 10 массивах.
Ну сам додумай короче. Если правильно все сделаешь - будет быстро и хеши не понадобятся.
|
K началу
|
|
|
Andryxa
Зарегистрирован: 13.04.04
Сообщения: 133
|
Добавлено: 10/09/04 в 17:53
|
|
Меня осенило! Это же так называемый "конкорданс"! Как-то давно еще читал, но не сразу вспомнил, что это оно.
цЫтата из книги: "Обычной проблемой анализа текстов является определение частоты и расположения слов в документе. Эта информация запоминается в конкордансе, где различные слова перечислены в алфавитном порядке и каждое слово снабжено ссылками на строки текста, в которых оно встречается Рассмотрим следующую цитату. Peter Piper picked a peck of pickled peppers. A peck of pickled peppers Peter Piper picked. If Piter Piper picked a peck of pickled peppers, where is the peck that Peter Piper pecked? Слово "piper" встречается здесь 4 раза в строках 1, 2 и 3. Слово "pickled" встречается 3 раза в троках 1 и 3"
По-моему, это оно. Тут применяется бинарное дерево поиска Тут приводится эта программа, но че-т меня ломает печатать 5 страниц текста У друзей отсканю. А если нашел книгу "Стр-ры данных в С++" Уильям Топп, то беги на 525 страницу )
Результат выполнения прораммы:
a.........................................3: 1 2 if.........................................1: 2 is.........................................1: 3 of........................................3: 1 2 peck.....................................4: 1 2 3 peppers................................3: 1 2 3 peter....................................4: 1 2 3 picked..................................3: 1 3 piper....................................4: 1 2 3 that.....................................1: 3 the......................................1: 3 where..................................1: 3
|
K началу
|
|
|
bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 10/09/04 в 19:34
|
|
круто... на всякий случай поставил всем +8 и ушел обдумывать вышесказанное.
|
K началу
|
|
|
Xrenoder
Зарегистрирован: 14.09.00
Сообщения: 637
|
Добавлено: 10/09/04 в 21:02
|
|
bog писал: | насчет CRC32 думал, но не стал делать потому что у меня там над массивом еще пара операций проводится при которых регулярные выражения используются... но смысл наверное все таки есть, так что попробую.
|
Дык исходный массив у тебя остается, делай с ним что хочешь. Просто сравнивать числа гораздо быстрее (на порядки быстрее) чем более-менее длинные строки, да и объем данных в памяти гораздо меньше. При сортировках и длинных данных это критично.
|
K началу
|
|
|
ghood
Зарегистрирован: 16.06.04
Сообщения: 183
|
Добавлено: 11/09/04 в 02:10
|
|
Xrenoder, респект, но у меня есть пара поправок к алгоритму.
1. CRC -- немножко не то, согласитесь, давайте уж брать тогда MD5, который разрабатывался специально для того, чтобы иметь наименьшее количество коллизий.
2. Вообще я себе представляю это немножко по-другому.
Имеется хэш (думаю что stl map вполне устроит). Ключ -- MD5(строки) Значение -- структурка: количество вхождений слова и список из координат этих слов в ваших файлах.
Добавление списка слов при любом количестве будет C(N), т.к. слово добавляется за константное время. После перебором по ключам мы можем выбросить всё, что не удовлетворяет нашим потребностям. Вот в принципе и всё.
Заметьте, что при таком подходе мы не загружаем всю инфу в память и избегаем сортировки. Точнее как-бы сортировка есть, но она быстрее сортировки Хора ( )
Возможно я что-то не так понял, если что будьте добры поправьте....
|
K началу
|
|
|
Xrenoder
Зарегистрирован: 14.09.00
Сообщения: 637
|
Добавлено: 11/09/04 в 02:26
|
|
ghood писал: | Xrenoder, респект, но у меня есть пара поправок к алгоритму. 1. CRC -- немножко не то, согласитесь, давайте уж брать тогда MD5, который разрабатывался специально для того, чтобы иметь наименьшее количество коллизий. 2. Вообще я себе представляю это немножко по-другому. Имеется хэш (думаю что stl map вполне устроит). Ключ -- MD5(строки) Значение -- структурка: количество вхождений слова и список из координат этих слов в ваших файлах. Добавление списка слов при любом количестве будет C(N), т.к. слово добавляется за константное время. После перебором по ключам мы можем выбросить всё, что не удовлетворяет нашим потребностям. Вот в принципе и всё. Заметьте, что при таком подходе мы не загружаем всю инфу в память и избегаем сортировки. Точнее как-бы сортировка есть, но она быстрее сортировки Хора ( ) Возможно я что-то не так понял, если что будьте добры поправьте.... |
Вероятность коллизии зависит от разрядности CRC. Разрядности 32 вполне хватает для задач, не связаных с ядерной энергетикой и запуском ракет, во всяком случае вся аппаратура сетевая использует именно CRC32 для контрольных сумм. Для параноиков и аккуратистов есть CRC64 - вероятность коллизии 1/(2^64) - прикинь сам. Все остальное вообще непонятно (мне во всяком случае). Человек просил алгоритм - я ему дал алгоритм, который проверено быстро работает на больших объемах строковых данных.
|
K началу
|
|
|
ghood
Зарегистрирован: 16.06.04
Сообщения: 183
|
Добавлено: 11/09/04 в 02:47
|
|
Xrenoder писал: | Вероятность коллизии зависит от разрядности CRC. Разрядности 32 вполне хватает для задач, не связаных с ядерной энергетикой и запуском ракет, во всяком случае вся аппаратура сетевая использует именно CRC32 для контрольных сумм. Для параноиков и аккуратистов есть CRC64 - вероятность коллизии 1/(2^64) - прикинь сам.
|
Насколько мне позволяет судить моё знание математики мощность отображения не даёт возможности судить о вероятности возникновения коллизии. Как вы абсолютно правильно заметили CRC это именно контрольная сумма... Дело в том, что этот алгоритм заточен под то, чтобы близкие элементы имели разные CRC. Это к сожалению ничуть не уберегает от коллизий при большом количестве элементов.
Попробую привести пример: имеется у нас тоже какая-то сумма например сумма всех символов по модулю 2^2048. Вероятность возникновения коллизии очень велика ( например одинаковую сумму будут иметь строки ab и ba), однако разрядность суммы поболей чем 64 бита.
Xrenoder писал: | Все остальное вообще непонятно (мне во всяком случае). Человек просил алгоритм - я ему дал алгоритм, который проверено быстро работает на больших объемах строковых данных. |
Просто у меня алгоритм работает ещё быстрее (исключены медленные сортировки). Сорри что не могу яснее изъясняться....
|
K началу
|
|
|
Xrenoder
Зарегистрирован: 14.09.00
Сообщения: 637
|
Добавлено: 11/09/04 в 03:54
|
|
ghood писал: | Попробую привести пример: имеется у нас тоже какая-то сумма например сумма всех символов по модулю 2^2048. Вероятность возникновения коллизии очень велика ( например одинаковую сумму будут иметь строки ab и ba), однако разрядность суммы поболей чем 64 бита.
|
Может быть, Вы путаете CRC с каким-то другим алгоритмом? Потому что у строк ab и ba будут разные CRC. На всякий случай напомню вкратце суть алгоритма CRC: если к битовой последовательности прилепить CRC этой битовой последовательности, то получившаяся в итоге последовательность будет делиться на базовый полином без остатка.
Вообще, насколько я помню, во всех описаниях алгоритма речь идет именно о таких вероятностях коллизий. И в общем-то это похоже на правду, насколько мне позволяет судить мое знание математики.
|
K началу
|
|
|
ghood
Зарегистрирован: 16.06.04
Сообщения: 183
|
Добавлено: 11/09/04 в 04:55
|
|
Xrenoder писал: | Может быть, Вы путаете CRC с каким-то другим алгоритмом? Потому что у строк ab и ba будут разные CRC. На всякий случай напомню вкратце суть алгоритма CRC: если к битовой последовательности прилепить CRC этой битовой последовательности, то получившаяся в итоге последовательность будет делиться на базовый полином без остатка. Вообще, насколько я помню, во всех описаниях алгоритма речь идет именно о таких вероятностях коллизий. И в общем-то это похоже на правду, насколько мне позволяет судить мое знание математики.  |
Сложно разговаривать когда твои посты не читают.  Я приводил пример с суммой символов дабы доказать что размерность хэш-функции не всегда влияет на её "правильность". Тем более что CRC назвать хэшем можно весьма условно.
Поскольку беседа сводится к флейму предлагаю следующие утверждения: 1. Размерность md5 больше размерности СRC32/64 2. Md5 разрабатывалась чтобы минимизировать коллизии, CRC чтобы определить целостность файла при передаче по плохим каналам, то есть для обнаружения ошибок. То есть это никоим образом не минимизирует коллизии. 3. Исходя из 1 и 2 вероятность коллизии у MD5 меньше чем у CRC64 4. На данных топикстартеря для CRC64 коллизий будет как минимум не мемньше чем у md5.
Уже собственно коллизий не касающиеся, но касающиеся топика. 5. Вставка в хэш происходит быстрее (в оценочном смысле) вставки в упорядоченный массив ( это к той части вашего алгоритма где вы упорядочивали массив )
Некоторые утверждения можно объявить голословными либо недоказанными, но неверными вряд-ли. И вообще считаю, что флейм следует прекратить, ибо топикстартеру это всё равно не поможет.
|
K началу
|
|
|
Xrenoder
Зарегистрирован: 14.09.00
Сообщения: 637
|
Добавлено: 11/09/04 в 05:11
|
|
ghood писал: | Сложно разговаривать когда твои посты не читают.  Я приводил пример с суммой символов дабы доказать что размерность хэш-функции не всегда влияет на её "правильность". Тем более что CRC назвать хэшем можно весьма условно. Поскольку беседа сводится к флейму предлагаю следующие утверждения: 1. Размерность md5 больше размерности СRC32/64 2. Md5 разрабатывалась чтобы минимизировать коллизии, CRC чтобы определить целостность файла при передаче по плохим каналам, то есть для обнаружения ошибок. То есть это никоим образом не минимизирует коллизии. 3. Исходя из 1 и 2 вероятность коллизии у MD5 меньше чем у CRC64 4. На данных топикстартеря для CRC64 коллизий будет как минимум не мемньше чем у md5. Уже собственно коллизий не касающиеся, но касающиеся топика. 5. Вставка в хэш происходит быстрее (в оценочном смысле) вставки в упорядоченный массив ( это к той части вашего алгоритма где вы упорядочивали массив ) Некоторые утверждения можно объявить голословными либо недоказанными, но неверными вряд-ли. И вообще считаю, что флейм следует прекратить, ибо топикстартеру это всё равно не поможет. |
Да, действительно, топикстартеру все это не поможет
|
K началу
|
|
|
ghood
Зарегистрирован: 16.06.04
Сообщения: 183
|
Добавлено: 11/09/04 в 05:17
|
|
Ну хоть бы тогда за активность рейтинга накинул...
|
K началу
|
|
|
bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 11/09/04 в 10:56
|
|
все заценил. насчет crc\md5 подумаю...
но вообще имхо crc32 в моем случае выгодней - так как длина строки намного меньше (а значит обработка быстрее)
насчет кол-ва уникальных строк - судя по предыдущему опыту будет самый максимум 8млн элементов.
если вероятность ошибки при этом будет хотябы 1\100000 - меня это устроит.
|
K началу
|
|
|
Andryxa
Зарегистрирован: 13.04.04
Сообщения: 133
|
Добавлено: 17/09/04 в 18:31
|
|
http://www.kursovik.net/programming/101018.html вот посмотри
|
K началу
|
|
|
bog
Зарегистрирован: 07.11.02
Сообщения: 1996
|
Добавлено: 18/09/04 в 12:11
|
|
Andryxa писал: | http://www.kursovik.net/programming/101018.html вот посмотри |
а какое отношение имеет =========== Название программы: «Частота слов» Язык программирования: Turbo Pascal Объект заявки: Исходный текст программы (Текст программы содержит в себе комментарии, поясняющие ее работу) Стоимость заказа составляет 135 руб. =========== к тому что здесь обсуждалось ? ))
|
K началу
|
|
|
Andryxa
Зарегистрирован: 13.04.04
Сообщения: 133
|
Добавлено: 18/09/04 в 14:21
|
|
bog писал: | а какое отношение имеет =========== Название программы: «Частота слов» Язык программирования: Turbo Pascal Объект заявки: Исходный текст программы (Текст программы содержит в себе комментарии, поясняющие ее работу) Стоимость заказа составляет 135 руб. =========== к тому что здесь обсуждалось ? )) |
ПРямое: Цитата: | нужно найти все строки которые встречается в 5ти (или более) из 10 массивов, чаще чем 3 раза в каждом. |
Тут ищутся слова, а тебе надо строки. То бишь у тебя частота строк. логично вроде
|
K началу
|
|
|