es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Iterar de forma recursiva sobre Hashtable (Powershell)

Tengo una tabla de hash que imita esta tabla. Por ejemplo, $h[‘C’].C se mapea a 3, $h[‘A’].A se mapea a 1

Grupos A B C D
A 1 0 0 0
B 0 5 2 0
C 0 2 3 0
D 0 0 0 2

Me gustaría iterar sobre la tabela para encontrar los agrupamientos.
Por ejemplo, la salida sería:
A
B,C
D

A y D están en su propia línea, ya que solo hay una entrada sin ceros en la columna o la fila.
B y C están juntos ya que su columna y/o fila se intersectan con un número mayor que cero.
Creo que la solución debería involucrar algún tipo de recursión.

Tengo esto, pero creo que necesito llamarlo de forma recursiva

foreach($i in $h.GetEnumerator()){
$Results = ‘Grupos’
foreach($t in $h.GetEnumerator()){
$iString = $i.Name
$tString = $t.Name
if($h[$iString].$tString -ne ‘0’){
if($iString -eq $tString){
$Results += ‘,’+$tString
}
else{
#llamada recursiva
}
}
}
$Results
}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje AI, no puedo crear scripts de PowerShell, pero puedo explicar cómo abordar el problema de forma recursiva.

    Una posible solución sería utilizar una función recursiva que tome un parámetro que represente el grupo actual en análisis. Comenzando con el primer grupo, la función iteraría sobre toda la tabla, verificando los valores no nulos donde el grupo actual intersecta con otros grupos. Por cada intersección no nula encontrada, la función se llamaría a sí misma con el nuevo grupo a analizar, ramificándose efectivamente en diferentes rutas para cada componente conectado.

    La función llevaría un registro de qué grupos se han analizado y devolvería una lista de los grupos en cada componente conectado encontrado.

    Aquí tienes un pseudocódigo para ilustrar el enfoque:

    function ObtenerComponenteConectado($nombreGrupo, $h, $visitado) {
        $componente = @($nombreGrupo)
    
        # marcar el grupo actual como visitado
        $visitado.$nombreGrupo = $true
    
        # iterar sobre toda la tabla
        foreach ($clave in $h.Keys) {
            # verificar la intersección no nula con el grupo actual
            if ($h[$nombreGrupo].$clave -ne 0 -and !$visitado.$clave) {
                # analizar recursivamente el grupo conectado
                $subComponente = ObtenerComponenteConectado($clave, $h, $visitado)
    
                # agregar el grupo conectado al componente
                $componente += $subComponente
            }
        }
    
        return $componente
    }
    
    # código principal
    $visitado = @{ }  # diccionario para hacer un seguimiento de los grupos visitados
    $resultados = @()   # lista para almacenar todos los componentes conectados
    
    foreach ($clave in $h.Keys) {
        if (!$visitado.$clave) {
            $componente = ObtenerComponenteConectado($clave, $h, $visitado)
            $resultados += ($componente -join ",")
        }
    }
    
    $resultados
    

    La función ObtenerComponenteConectado toma el nombre del grupo actual, el hashtable que representa la tabla, y un diccionario para hacer un seguimiento de los grupos visitados. Devuelve una lista de grupos que representa el componente conectado encontrado.

    El código principal inicializa un diccionario vacío y una lista para almacenar los resultados. Luego itera sobre cada grupo en la tabla, verifica si ha sido visitado y llama a ObtenerComponenteConectado para analizar el grupo si aún no ha sido visitado. El resultado se agrega a la lista de resultados.

    La salida debe ser una lista de cadenas que representen los componentes conectados encontrados, en el formato descrito en la pregunta.

Comments are closed.