[Cascavel-pm] algoritmo

Marco A P D´Andrade mda em embratel.net.br
Terça Junho 22 18:41:42 CDT 2004


Luis,

Vc não foi muito claro, porém eu estou assumindo que vc calcula a 
posição entre:

1o elemento e ultimo alterado (regra1) + ultimo alterado e ultimo 
elemento (regra 2)


Suponho como resposta, não muito elegante, pois depende de variaveis 
globais:

#--
use strict;
use warnings;
 my @Itens;
 my $Max = 10;
 my ( $LastChange );
  map {
    Insere( $_ );
    print "+$Itens[-1]($Max): @Itens\n";
    } ( 1 .. 10 );

        print "$Itens[-1]($Max): @Itens ($LastChange)\n";
  Insere( 11 );    print "$Itens[-1]($Max): @Itens ($LastChange)\n";
  Insere( 12 );    print "$Itens[-1]($Max): @Itens ($LastChange)\n";

sub Insere {
 my ( $Val ) = @_;
 my ( $Range1, $Range2 );
  # Atingiu o limite
  if (  @Itens  == $Max ) {

     # Nao houve nenhuma alteracao ainda
     unless ( $LastChange ) {
         $LastChange = int(($Itens[-1]-$Itens[0])/2);
  
      } else {
         # Range inferior
         $Range1 = int(($Itens[0]-$Itens[$LastChange])/2);

         # Range superior
         $Range2 = int(($Itens[-1]-$Itens[$LastChange])/2);

         $LastChange = ( $Range1 > $Range2 ? $Range1 : $LastChange + 
$Range2 );

     }

     # Removo um item
     splice(@Itens, --$LastChange, 1);
  }

  # acrescento ...
  push(@Itens, $Val);

}
---
Bate com seus valores...
Feito com somente 2 ranges fixos, utilizando variavel e memoria em 
variaveis globais (nao recomendo).

Agora diga... qual o uso prático ?


Sds,
Marco Antonio



Luís Fernando wrote:

>Sei que esse não é um problema de específico perl (e sim mais de
>algoritmo), mas agradeço se alguém puder me ajudar :)
>
>Eu tenho um buffer não-sequencial* de 100 bytes, e vou gravando "seqüências ordenadas de
>amostragem" nele.
>Supondo: eu recebo 1 amostra de 1 byte a cada segundo, e salvo-a no
>final desse buffer. Para facilitar o entendimento, vou supor que essa amostra é uma
>seqüência que começa no 1 quando eu rodo o programa e vai
>incrementando de 1 a cada segundo.
>O problema é que uma hora o buffer vai encher. Quando isso acontecer,
>para ter o mínimo de perda possível, quero que amostras sejam apagadas
>"da melhor forma possível".
>
>Se, quando chegasse em 100 bytes, para adicionar uma
>nova eu apagasse a primeira (e assim por diante), eu perderia todos os
>dados antigos. Em vez disso, eu prefiro ter amostras a cada 2
>segundos.
>Clareando: Se eu tenho o buffer de 100 bytes e recebo 200 informações,
>eu não armazenaria apenas as 100 últimas, e sim "1 sim outra não"
>(ficaria, no buffer, 1 3 5 7 9, etc.).
>
>Mas como as informações "vão chegando" (tempo real), não dá para
>saber quantas vão ter.
>
>
>Melhor solução que consegui pensar até agora:
>- quando rodar o programa, inicie uma lista vazia;
>- a cada amostra recebida, verifique qual o intervalo entre os
>extremos do buffer e os valores da lista e os intervalos entre
>os próprios valores (calma que já explico melhor). Escolha o que for
>maior e insira no meio deles.
>
>Agora explicando:
>Se eu posso colocar 10 elementos, e já coloquei:
>1 2 3 4 5 6 7 8 9 10
>
>Agora chegou o "11". Como a lista está vazia, eu verifico o intervalo
>entre o "1" e o "10" (int((10-1)/2) = 4). Vou lá e APAGO a POSIÇÃO 4
>(* automaticamente, por causa da estrutura de dados, o 5 já vira 4, o 6
>vira 5, etc.) e salvo-a na lista.
>Terei agora:
>1 2 3 5 6 7 8 9 10 11
>
>Quando chegar o "12", Faço a diferença entre 1 e 4 (int((4-1)/2) = 1) e entre
>10 e 4 (int((10-4)/2) = 3). O "3" é maior, então eu apago o elemento
>entre o 4 e o 10 (no caso, "7") e insiro novamente no final.
>
>Espero não ter sido MUITO confuso.
>
>Alguém consegue pensar numa solução mais eficiente?
>
>Obrigado por ter lido até aqui :P
>
>/*
>
>+---------------------------------+
>| Luís Fernando Estrozi           |
>+---------------------------------+
>| Ciência da Computação - USP     |
>|                                 |
>| mailto:lemon em grad.icmc.usp.br   |
>| ICQ#: 25541891                  |
>|                                 |
>| http://grad.icmc.usp.br/~lemon/ |
>+---------------------------------+
>
>There are 10 types of people in the world: Those who understand binary, and those who don't
>
>*/ EOF
>
>_______________________________________________
>Cascavel-pm mailing list
>Cascavel-pm em mail.pm.org
>http://cascavel.pm.org/mailman/listinfo/cascavel-pm
>
>
>





Mais detalhes sobre a lista de discussão Cascavel-pm