• Publicidad

Hash

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Hash

Notapor afry » 2008-07-30 15:16 @678

Hola, me gustaría saber qué es lo que significan de forma detallada, a poder ser, las condiciones y las instrucciones que se precisan en este bucle que es el fragmento de un programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $key (keys %hash) {
    $flag = 0;
    my $B = $hash{$key};
    foreach my $key2 (keys %hash) {
        my $B2 = $hash{$key2};
        if($B2==$B && $key2!=$key && $key2<$key) {
            $flag=1;
        }
    }

    if ($flag == 1) {
        delete $hash{$key};
    }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Muchas gracias, espero respuesta
afry
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2008-07-05 13:43 @613

Publicidad

Notapor explorer » 2008-07-30 15:40 @694

Código: Seleccionar todo
* Para todas las claves de un hash
*   Ponemos una bandera a 0
*   Obtenemos el valor asociado a esa clave
*   Para todas las claves del mismo hash
*       Obtenemos el valor asociado a esa clave
*       Si los dos valores son iguales, y,
*       Si las dos claves son distintas, y,
*       Si la primera clave es mayor que la segunda
*           entonces la bandera se pone a 1
*   Fin del bucle
*   Si la bandera está a 1 (hemos encontrado una clave que es menor que la de búsqueda)
*       Borramos el elemento hash
* Fin del bucle


Creo que, más o menos, lo que hace es eliminar los elementos de un hash que, a igualdad de valores, tenga una clave compañera de menor valor. El resultado final es que quedan claves de cada vez menor valor numérico.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Jenda » 2008-08-01 14:27 @643

Hay otras y mejores formas para hacer esto. El problema con esa solución es que es de complejidad O(n*n). Más comprensiblemente, que el tiempo necesario para completarlo sube bastante rápidamente con el número de claves en el hash. Si el número de claves se dobla, el tiempo se cuadruplica (pues, después de traspasar algún número, el O() significa que hay algunas constantes que necesitaríamos si quisiéramos computar el tiempo necesario, pero no nos importan ahora. Ver http://es.wikipedia.org/wiki/Cota_super ... %C3%B3tica )

Aquí hay otras dos posibilidades:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
{
        my %tmp;
        foreach my $key (sort keys %hash) {
                $tmp{$hash{$key}} = $key unless exists $tmp{$hash{$key}};
        }
        %hash = reverse %tmp;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

o
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
{
        my %tmp;
        foreach my $key (keys %hash) {
                $tmp{$hash{$key}} = $key if !exists $tmp{$hash{$key}} or $tmp{$hash{$key}} > $key;
        }
        %hash = reverse %tmp;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La primera es O(n*log(n)), la segunda O(n). Ambas usan el otro hash. El otro hash nos ayuda a obtener los valores únicos.

Espero que explorer puede ponerlo más claro, mi español es terrible.

Jenda
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor Jenda » 2008-08-01 14:51 @660

Actualmente el primer código es inútilmente complejo. Se puede simplificar en
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
{
        my %tmp;
        foreach my $key (sort {$b <=> $a} keys %hash) {
                $tmp{$hash{$key}} = $key;
        }
        %hash = reverse %tmp;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

o
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
{
        my %seen;
        foreach my $key (sort keys %hash) {
                delete $hash{$key} if $seen{$hash{$key}}++;
        }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados