Для меня оказалось проще всего реализовать это на perl, но хотелось бы сравнить с реализациями на PHP и Python, кто хочет реализовать на C/C++ или asm - дерзайте, тоже будет интересно сравнить. Код (Text): #!/usr/bin/perl -w open(IN, "< in.txt") or die "Can't open file: $!"; open(OUT, "+> out.txt") or die "Can't open file out.txt for writing: $!"; @input = <IN>; close(IN); %seen = (); foreach $item (@input) { unless ($seen{$item}) { $seen{$item} = 1; print OUT $item; } } close(OUT);
То же самое на Python'е: Код (Text): #! /usr/bin/env python input = open('in.txt', 'r') output = open('out.txt', 'w') linesarray = input.readlines() input.close() seen = [] for i in range(len(linesarray)): if seen.count(linesarray[i]) == 0: seen.append(linesarray[i]) output.write(linesarray[i]) output.close()
Код (Text): $strings = File("In.txt"); $file_out = fopen("Out.txt", "w"); $strings = array_unique($strings); foreach($strings as $value) fputs($file_out, $value); fclose($file_out); А если находить дубликаты вручную, то мне больше нравится традиционный for, чем foreach: Код (Text): $strings = File("In.txt"); $file_out = fopen("Out.txt", "w"); $length = sizeof($strings); for($i = 0; $i < $length; $i++) { for($j = $i + 1; $j < $length; $j++) if($strings[$i] == $strings[$j]) break; if($j == $length) fputs($file_out, $strings[$i]); } fclose($file_out);
Вот это - Код (Text): foreach $item (@input) { unless ($seen{$item}) { $seen{$item} = 1; print OUT $item; } } в принципе, ничего. Но логика немножко извратная. Ну, а сие: Код (Text): for($i = 0; $i < $length; $i++) { for($j = $i + 1; $j < $length; $j++) if($strings[$i] == $strings[$j]) break; if($j == $length) fputs($file_out, $strings[$i]); } цикл в цикле - О(N<sup>2</sup>) - чересчур. Истинное же решение было предложено Sten'ом давно на этом же форуме. Если предельно кратко. В виде псевдокода. 1. Прочитать файл в массив @arr 2. Отобразить @arr на %arr при помощи map. Все. На шаге 2 будут удалены все дубликаты. Причем, очень эффективным способом.
Скорее всего, я неправ, но цикл в цикле - меньшее зло, чем вызов процедуры в цикле. А у меня внутренний цикл запускается каждый раз с меньшим количеством итераций. А вообще - все это неважно, жизнь прекрасна, а сетевое программирование - медленно.
volodya > в принципе, ничего. Но логика немножко извратная. Логика самая что ни на есть прямая, если элемента с именем $item нет в хэше, то можно print его в файл, плюс добавить элемент в хэш > Неэффективно. Можно быстрее Ну не знаю, как его сравнивать по эффективности, это ж не асм чтоб засунуть код в профайлер..
Ну не знаю, как его сравнивать по эффективности http://www.unix.org.ua/orelly/perl/perlnut/ch06_05.htm
volodya > http://www.unix.org.ua/orelly/perl/perlnut/ch06_05.htm О! Эта книга у меня есть. С этим понятно но не совсем, т.е. листинг я получить не смог. > 1. Прочитать файл в массив @arr 2. Отобразить @arr на %arr при помощи map. Хотел бы увидеть реализацию.. Что-то типа: Код (Text): %hash = map { genkey($_), $_ } @array; ???
volodya Понял! Код (Text): #!/usr/bin/perl -w open(IN, "< in.txt") or die "Can't open file: $!"; open(OUT, "+> out.txt") or die "Can't open file out.txt for writing: $!"; @lines = <IN>; close(IN); %hash = map {$_, 0} @lines; @lines = sort keys %hash; print OUT @lines; close(OUT); А куда девался bsl_zcs ?
Может, ему просто наскучил форум... Увы, здесь мало алгоритмистов высокого класса Все больше про иконочки в трее спрашивают...
На PHP можно сделать короче и без циклов например(модифицируя пример товарища выше) Код (Text): $strings = array_unique(File("In.txt")); $file_out = fopen("Out.txt", "w"); fwrite ($file_out,implode("",$strings)); fclose($file_out); Или даже так Код (Text): $file_out = fopen("Out.txt", "w"); fwrite ($file_out,implode("",array_unique(File("In.txt")))); fclose($file_out);