Thread suche in einem array (20 answers)
Opened by bo at 2006-12-21 12:12

bloonix
 2006-12-29 17:24
#72681 #72681
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Doc's Beispiel kann man auch noch tunen. Der Aufruf von Subs ist ja
für gewöhnlich etwas langsamer... mit ner Schleife lässt es sich nochmal
um knapp 100% verbessern.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use strict;
use warnings;
use Data::Dumper;
use Benchmark qw(cmpthese);

my @ids = (0..10000);
my $id  = 10000;

Benchmark::cmpthese(-1,{
  'docSearch' => sub { docSearch(\@ids, $id, 0, $#ids) },
  'tpgSearch' => sub { tpgSearch(\@ids, $id, 0, $#ids) },
  'tunSearch' => sub { tunSearch(\@ids, $id, 0, $#ids) },
});

sub tunSearch {
  my ($arrRef, $val, $minIdx, $maxIdx) = @_;
  my $mid;

  while ($minIdx != $maxIdx) {
     $mid = int(($maxIdx + $minIdx)/ 2);
     if ($arrRef->[$mid] == $val) {
        return $mid;
     } elsif ($arrRef->[$mid] > $val) {
        #? docSearch($arrRef, $val, $minIdx, $mid)
        $maxIdx = $mid
     } else {
        #: docSearch($arrRef, $val, $mid+1, $maxIdx);
        $minIdx = $mid+1;
     }
  }

  return undef;
}

sub docSearch {
  my ($arrRef, $val, $minIdx, $maxIdx) = @_;
  my $mid = int(($maxIdx + $minIdx)/ 2);

  return $arrRef->[$mid] == $val
            ? $mid
            : $minIdx == $maxIdx
               ? undef
               : $arrRef->[$mid] > $val
                  ? docSearch($arrRef, $val, $minIdx, $mid)
                  : docSearch($arrRef, $val, $mid+1, $maxIdx);
}

sub tpgSearch {
  my ($ref, $val, $min, $max) = @_;

  if($id >= $$ref[$min] && $id <= $$ref[$max]) {
     my $diff = ($ref->[$max] - $ref->[$min]) / ($max - $min);
     my $pos = int($val / $diff);

     if ($$ref[$pos] < $val) {
        $pos++ while ($val > $$ref[$pos]);
     } elsif($$ref[$pos] > $val) {
        $pos-- while ($val < $$ref[$pos]);
     }

     return $pos if $val == $$ref[$pos];
  }

  return undef;
}


             Rate docSearch tunSearch tpgSearch
docSearch  32881/s        --      -48%      -87%
tunSearch  63621/s       93%        --      -75%
tpgSearch 256955/s      681%      304%        --
\n\n

<!--EDIT|opi|1167405867-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.

View full thread suche in einem array