Skip to content

Instantly share code, notes, and snippets.

@klopp
Last active April 26, 2019 12:31
Show Gist options
  • Save klopp/5ac9288ea7d27e63f5bc1443d9bb4e1a to your computer and use it in GitHub Desktop.
Save klopp/5ac9288ea7d27e63f5bc1443d9bb4e1a to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
# Дан хеш %h. Необходимо удалить из него лишние пары, у которых
# значения повторяются (т.е. только 1 такую пару оставить) наиболее
# эффективным методом. В хеше может быть миллион пар, так что
# приоритет – процессорное время.
use Modern::Perl;
# Ахтунг! Во всех вариантах не учитывается порядок следования ключей.
use constant HASH_SZ => 1_000_000;
use constant MAX_VAL => HASH_SZ / 10;
# --------------------------------------------------------------
my %HASH;
$HASH{$_} = int( rand(MAX_VAL) ) for 1 .. HASH_SZ;
# my $rc = t1(\%HASH);
# say "Size: ", (scalar keys %{$rc}), '/', (scalar keys %HASH);
# --------------------------------------------------------------
# Лидер рейтинга по скорости.
sub t0
{
my ($HASH) = @_;
my %exists;
while( my ($key, $val) = each %{$HASH} ) {
delete $HASH->{$key} if $exists{$val}++;
}
}
# --------------------------------------------------------------
# Решение в лоб. Запоминаем только ключи с уникальными значениями
# (если такое значение уже встретилось - ключ пропускаем).
# Не очень быстро... Но исходный хэш не курочим.
sub t1
{
my ($HASH) = @_;
my %exists;
my %rc;
while( my ($key, $val) = each %{$HASH} ) {
$rc{$key} = $val unless exists $exists{$val};
++$exists{$val};
}
return wantarray ? %rc : \%rc;
}
# --------------------------------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment