Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

файл без пустых и повторяющихся строк.

25K
15 апреля 2008 года
clop1000
6 / / 20.04.2007
вобщем нужно сделать по заданию файл без пустых и повторяющихся строк.
как узнть повтор?
6.6K
15 апреля 2008 года
Ordos
105 / / 02.11.2007
Сравнить...
25K
15 апреля 2008 года
clop1000
6 / / 20.04.2007
я не понимаю как каждую строку можно сравнить со всеми
6.6K
15 апреля 2008 года
Ordos
105 / / 02.11.2007
Цитата: clop1000
я не понимаю как каждую строку можно сравнить со всеми



int n = StringCount;
for(int i = 0; i < n; i++)
{
for(int j = i; j < n; j++)
{
if(строка с инексом i равна строке с инексом j) ...
}
}

6.6K
15 апреля 2008 года
Ordos
105 / / 02.11.2007
или тут проблема в том, что строки в файле? тога сначала их нужно от туда считать в массив строк.
360
16 апреля 2008 года
P*t*
474 / / 15.02.2007
Цитата: Ordos
int n = StringCount;
for(int i = 0; i < n; i++)
{
for(int j = i; j < n; j++)
{
if(строка с инексом i равна строке с инексом j) ...
}
}



это жутко долго будет работать - O(n^2 * length).

можно строить бор из строк и для каждой последующей проверять там наличие. сложность - O(n * length)

P.S Если непонятно - могу написать подробнее.

6.6K
16 апреля 2008 года
Ordos
105 / / 02.11.2007
Цитата: P*t*
это жутко долго будет работать - O(n^2 * length).

можно строить бор из строк и для каждой последующей проверять там наличие. сложность - O(n * length)

P.S Если непонятно - могу написать подробнее.



Зато это тут особо думать не нужно :о)
Если это, скажем, лаба по инфе, то фиг бы, что долго, зато человек, если его спросят, сможет легко разобраться.

360
16 апреля 2008 года
P*t*
474 / / 15.02.2007
В моём варианте тоже думать особо ненужно... Я могу всю прогу минут за 20 написать...

Впрочем это скорее решение с точки зрения олимпиадного программирования - на время работы есть серьёзные ограничения.
490
20 мая 2008 года
frid-karatel
357 / / 15.09.2007
Цитата: P*t*
В моём варианте тоже думать особо ненужно... Я могу всю прогу минут за 20 написать...

Впрочем это скорее решение с точки зрения олимпиадного программирования - на время работы есть серьёзные ограничения.



а можно код предоставить? чтобы быстро все было... очень заинтересовало ;)
PS: этот код работает только с Ansi? или с Wide тоже будет работать...

2
20 мая 2008 года
squirL
5.6K / / 13.08.2003
самый простой код.
[highlight=bash]
cat file | uniq | egrep -v ^$
[/highlight]
посложнее
[highlight=perl]
my $hash = {};
$hash->{$_}++ while (<>);
for (keys %$hash) { chomp; print if $_; }
[/highlight]
490
20 мая 2008 года
frid-karatel
357 / / 15.09.2007
А на C++ есть? :)
2
20 мая 2008 года
squirL
5.6K / / 13.08.2003
Цитата: frid-karatel
А на C++ есть? :)


а почему сразу не написать, что на С++ ;)

я в С++ не силен, но если что - наши гуру поправят.
[highlight=C++]
#include <map>
#include <string>
#include <iostream>

int main() {
std::map <std::string,int> hash;
std::string str;

while( std::cin >> str ) hash[str]++;

std::map<std::string,int>::iterator i;

for( i = hash.begin(); i != hash.end(); i++ ) {
if ( i->first != "")
std::cout << i->first << std::endl;
}
return 0;
}
[/highlight]
обращаю внимание - программа работает не с файлом, а с входным потоком данных, т. е. данные можно как вводить с клавиатуры, так и подавать через каналы на вход.

360
21 мая 2008 года
P*t*
474 / / 15.02.2007
Цитата: frid-karatel
а можно код предоставить? чтобы быстро все было... очень заинтересовало ;)
PS: этот код работает только с Ansi? или с Wide тоже будет работать...



[highlight=c++]
#include <stdio.h>
#define nil -1
int next = 0;
int children[1000][255];
bool isEnd[1000];

bool addString(int b, char* str) {
if (str[0]==0) {
if (isEnd) return false;
isEnd = true;
return true;
}
if (chidren[str[0]]==nil) {
chidren[str[0]] = next;
for (int a=0;a<255;a++) children[next][a] = nil;
isEnd = false;
next++;
}
return addString(children[str[0]], str+1);
}

int main() {
for (int a=0;a<255;a++) children[next][a] = nil;
isEnd = false;
next++;
while (true) {
char* str;
scanf("%s", &str);
if (addString(0, str)) printf("%s\n", str);
}
}
[/highlight]
Не уверен что работает - не тестировал.
Сложность алгоритма - O(n*length* c) (c - размер алфавита)
Вариант squirL работает, как мне кажется, за O(n*log(n) * length)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог