HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование_OLD > PHP, PERL, MySQL, JavaScript
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 08.02.2007, 12:25
k1b0rg
Тут может быть ваша реклама.
Регистрация: 30.07.2005
Сообщений: 1,243
Провел на форуме:
4520553

Репутация: 1316


По умолчанию

Helios

твой код можно заменить одной функцией array_unique которуая удалит все дубликаты из массива.


Я думаю алгоритм для больших файлов должен быть следующим:
открытие файла (fopen)
чтение строки.
пробежать по файлу в поисках дубликата с места нахождения этой строки.
Если найдено то занести в массив.
В итоге будет два массива, один чистый а в другом будут все найденные совпадения.
 

  #2  
Старый 08.02.2007, 14:49
KSURi
Постоянный
Регистрация: 06.06.2006
Сообщений: 515
Провел на форуме:
1985206

Репутация: 963


По умолчанию

Это по тому что, написал киба (perl, портировать на php не составит труда)
Код:
foreach(@tmp) { push(@unqie,$_) if !$seen{$_}; $seen{$_}=1; }
@tmp - список в который считывается файл
@unique - список в котором окажутся все уникальные строки
%seen - хэш, в котором будут повторы (key=>имя_повтора, value=>всегда 1)
Хотя я не совсем уверен, что это есть оптимальный алгоритм... Хотя хз...

UPD:
Код:
E:\>perl unique.pl
All: 1008176; Unique: 1000000; Time: 17 secs
E:\>
Oбрабатывался файл размером 25 284 608 байт (1008176 строк)

Последний раз редактировалось KSURi; 08.02.2007 в 15:13..
 

  #3  
Старый 08.02.2007, 20:59
k1b0rg
Тут может быть ваша реклама.
Регистрация: 30.07.2005
Сообщений: 1,243
Провел на форуме:
4520553

Репутация: 1316


По умолчанию

Написал аналог php'шной функции


sub array_unique(@)
{
@input=@_;
%temp=();
foreach $item (@input) {
push(@output, $item) unless $temp{$item}++;
}
return @output;
}

использовать так:

@arr=array_unique(@arr);
 

  #4  
Старый 08.02.2007, 21:55
KSURi
Постоянный
Регистрация: 06.06.2006
Сообщений: 515
Провел на форуме:
1985206

Репутация: 963


По умолчанию

Я модифицировал функцию от кибы и получилось вот что:
Код:
sub array_unique
{
  my $input=shift;
  my %seen;
  my $i=0;
  foreach(@{$input})
  {
    delete @{$input}[$i] if $seen{$_};
    $seen{$_}=1;
    $i++;
  }
}
Работает теперь вот так:
Код:
E:\>perl unique.pl
All: 1008176; Unique: 1000000; Time: 8
E:\>
Вызывать ее теперь вот так: array_unique(\@arr);

Последний раз редактировалось KSURi; 08.02.2007 в 22:12..
 
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите Proxy $ZLO$ Болталка 3 06.02.2005 14:29



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ