If they are all odd numbers, then their LSB is always 1, isn't it?
Why don't you just drop that bit then, and test for the bitwise ANDs of the resulting numbers being 0?
my @chopped_array = map { $_ >> 1 } @original_array;
my %result;
foreach my $i1 (0..$#chopped_array) {
foreach my $i2 ($i1..$#chopped_array) {
$result{ $original_array[$i1] } = $original_array[$i2] unless
+$chopped_array[$i1] & $chopped_array[$i2];
}
}
This algorithm is still quadratic, though - you still
need to do N^2/2 comparisons for an N-sized array.
But what if you build an auxiliary hash out of those lsb-shifted-off integers, then for every value simply check whether the bitwise negated value is present among the hash keys?
my %hash = map { ($_ >> 1) => 1 } @original_array;
my %result;
foreach (keys %hash) {
$result{($_ << 1) + 1} = ~($_ << 1) if $hash{ ~$_ };
}
Or something like this.
Beware of bugs, as I have not tested the code above, nor have I proved it correct :)
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|