Last active
April 26, 2019 12:31
-
-
Save klopp/5ac9288ea7d27e63f5bc1443d9bb4e1a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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