Форум программистов, компьютерный форум CyberForum.ru

Файлы и строки: проверить каждую строку на сходство друг с другом - C++

Восстановить пароль Регистрация
 
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 14:13     Файлы и строки: проверить каждую строку на сходство друг с другом #1
У меня такой вопрос, допустим у нас есть текстовый файл, там ОЧЕНЬ много символов, мне нужно проверить каждую строку на сходство друг с другом. Если разбить этот файл на 2 части(т.е. создать еще один файл и туда поместить половину строк от первого), то программа быстрее будет работать? Или это все глупости?)
Если глупости, то каким образом можно ускорить работу программы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2013, 14:13     Файлы и строки: проверить каждую строку на сходство друг с другом
Посмотрите здесь:

C++ АТД список. Расположение одинаковых элементов друг за другом
Вывести четыре следующих друг за другом гласных букв C++
Проверить одну строку на наличие в ней слова из второй строки C++
C++ Строки. Преобразовать строку, заменяя каждую цифру соответствующим ей числом символов нижнего подчеркивания
Прокомментировать каждую строку кода (или хотя бы каждую функцию) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 14:38     Файлы и строки: проверить каждую строку на сходство друг с другом #2
Выходит, что у тебя есть примерно такой файл?
"1234567
123
1
123456789
1234
1234
12345678"
, так?

Если да, то разбивать ничего не нужно. Это глупость. Просто если строки длинные (как вы сказали "много символов"), то самым правильным будет вместо проверки самих строк сначала проверять равенство их длин, а уж потом, если совпадут, и сами строки на равенство. Более того, если первая строка была проверена со всеми остальными, то вам не нужно больше её трогать, и трогать те, что были проверены. Можно завести доп. массив флагов для строк. Примерный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i = 0; i < n - 1; ++i)
{
    if (flag[i] == 0)
    {
        for (int j = i + 1; j < n; ++ j) //j подстраивается под i. Это нужно для того, чтобы не проверять уже проверенные строки
        {
            if (flag[j] == 0 && length[i] == length[j] && str[i] == str[j]) // равенство строк не проверяется, если не выполняется второе или первое
            {
                //do something. j-ая строка - это строка-копия i-ой строки.
                flag[j] = 1; 
            }
        }
    }
}
Если же строк много, но их длина не большая, то лучше будет тогда убрать length. (небольшая = ~5-15 символов. Хотя я точно не уверен в этом)
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 14:55  [ТС]     Файлы и строки: проверить каждую строку на сходство друг с другом #3
Мне очень понравилась идея, спасибо)

Добавлено через 7 минут
Можно еще вопрос? Как мне начинать проверку? Как мне считать первую строку так, что бы сравнение шло уже со второй строки. Я думал сравнивать getline(строка, sizeof(строка)), ведь таким образом размер строки будет определяться сам.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 15:20     Файлы и строки: проверить каждую строку на сходство друг с другом #4
ed8009, не понял вопроса.
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 15:22  [ТС]     Файлы и строки: проверить каждую строку на сходство друг с другом #5
Как проверить строки на равенство? Просто во всех примерах одна строка уже известно и ее сравнивают с остальными в файле.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 15:32     Файлы и строки: проверить каждую строку на сходство друг с другом #6
ed8009, опять не понял.
Файл большой-пребольшой? Его можно засунуть в обычный массив строк? Если да, то считываете весь файл и сверяете строки. Если нет, то можно пойти "обходом" : считать каждую строку отдельно, подсчитывая их length. Закрыть файл и открыть его в двоичной форме, где можно будет при помощи fseek и используя массив length гулять по самим строкам. В обычном файле такое не прокатит, он последовательного доступа.
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 15:37  [ТС]     Файлы и строки: проверить каждую строку на сходство друг с другом #7
Файл большой-пребольшой. Размер строки может быть 10, а может и 5000. Я тогда думал сделать так
#define MAXBUF 5000
char s[MAXBUF]
Но таким образом мы будем долго проверять файл.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 15:42     Файлы и строки: проверить каждую строку на сходство друг с другом #8
ed8009, а кол-во строк сколько может быть?
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 15:43  [ТС]     Файлы и строки: проверить каждую строку на сходство друг с другом #9
Сколько угодно.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.05.2013, 15:51     Файлы и строки: проверить каждую строку на сходство друг с другом #10
ed8009, ну тогда делаешь вторым способом (используя двоичный файл).
Заводишь:
C++
1
2
#define MAXBUF 5000
 char s[MAXBUF]
и читаешь строки одну за другой, высчитываешь их length, потом по алгоритму.
Фактически, будет прочитано "n+n+(n-1)+(n-2)+..2"-строк.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2013, 15:56     Файлы и строки: проверить каждую строку на сходство друг с другом
Еще ссылки по теме:

C++ Объединить два массива друг за другом
Проверить, можно ли из букв строки А составить строку В C++
C++ Как правильно потоки должны взаимодействовать друг с другом?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ed8009
7 / 7 / 1
Регистрация: 31.08.2011
Сообщений: 135
23.05.2013, 15:56  [ТС]     Файлы и строки: проверить каждую строку на сходство друг с другом #11
Ага, понятно, спасибо огромное!)
Yandex
Объявления
23.05.2013, 15:56     Файлы и строки: проверить каждую строку на сходство друг с другом
Ответ Создать тему
Опции темы

Текущее время: 05:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru