Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re^2: Create unique array --the hard way!

by Anonymous Monk
on Mar 07, 2014 at 21:39 UTC ( [id://1077460]=note: print w/replies, xml ) Need Help??


in reply to Re: Create unique array --the hard way!
in thread Create unique array --the hard way!

Many thanks to all of you guys!!
  • Comment on Re^2: Create unique array --the hard way!

Replies are listed 'Best First'.
Re^3: Create unique array --the hard way!
by Anonymous Monk on Mar 07, 2014 at 22:07 UTC
    I wonder, could this be done using the splice function as well? But how would you use it?

      Well, you could but I don't know why you'd want to.

      In the following script (using Benchmark) you'll see:

      • splice is relatively less efficient. I also suspect it might have future maintainers scratching their heads wondering why it was used ("splice @array, 0, 1" has identical functionality to "shift @array" — it's just slower and requires more keystrokes to code).
      • shift is more efficient than splice.
      • My original map is faster than both of those; it doesn't destroy the original array; and it's a lot less coding.
      #!/usr/bin/env perl use strict; use warnings; use Benchmark qw{cmpthese}; cmpthese -1 => { splice_unique => \&splice_unique, shift_unique => \&shift_unique, map_unique => \&map_unique, }; sub splice_unique { my @sorted = sort qw{q w e r t y q w e r t y}; my $last = ''; my @unique; while (@sorted) { my $element = splice @sorted, 0, 1; if ($last ne $element) { $last = $element; push @unique, $element } } } sub shift_unique { my @sorted = sort qw{q w e r t y q w e r t y}; my $last = ''; my @unique; while (@sorted) { my $element = shift @sorted; if ($last ne $element) { $last = $element; push @unique, $element } } } sub map_unique { my @sorted = sort qw{q w e r t y q w e r t y}; my $last = ''; my @unique = map { $last eq $_ ? () : ($last = $_) } @sorted; }

      Representative result:

      Rate splice_unique shift_unique map_unique splice_unique 93699/s -- -5% -20% shift_unique 98642/s 5% -- -16% map_unique 117028/s 25% 19% --

      -- Ken

        Ah ok, I thought slice would not involve pushing the unique elements into a new array, rather remove them "as-you-go" if the array is sorted, since they would be next to each other...

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1077460]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (8)
As of 2024-04-25 11:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found