Programa Java para encontrar el tamaño del conjunto independiente más grande (LIS) en un árbol de array N dado

Básicamente, un árbol de array N es una estructura de árbol en la que cada Node puede tener un número máximo de ‘N’ de hijos. El conjunto independiente más grande es un conjunto de vértices en el que no hay dos vértices adyacentes entre sí. Entonces, básicamente, en este programa, tenemos que ver cómo podemos encontrar el tamaño de un conjunto tan grande en el árbol N-array. Aquí estamos implementando el árbol usando un vector en java y se usa su idea de lista de adyacencia de la teoría de grafos. 

El algoritmo va como:

Lo que principalmente vamos a hacer es que vamos a crear un método LIS(int a) al que se le pasa el número del Node actual. Este es un método recursivo. En este método, primero verificaremos las condiciones base. Antes de discutir las condiciones base, primero debemos ver el resto del método. 

Entonces, en el código, para cada Node, vemos principalmente que si se incluye ese Node insertado, se obtiene el conjunto más grande o no. De lo contrario, ese Node en particular no está incluido, pero dado que este Node no está incluido, tenemos que repetir el mismo proceso para sus hijos. Pero si el Node está incluido, entonces no podemos incluir sus hijos, por lo que debemos verificar para sus nietos lo mismo que hicimos para el padre, y de esta manera podemos saber si incluir este Node o no.

Ahora llegando a los casos base: 

  1. Si el Node es nulo, lo que significa que el Node no existe, no podemos incluir nada.
  2. Si el Node es una hoja entonces debemos incluirlo.

¿Por qué incluir siempre aquellos Nodes que son Nodes de hoja, cuando se les llama al método?

La parte principal para pensar aquí es que algún Node puede pasarse a este método solo si su padre no está incluido en el conjunto, excepto el raíz. Entonces, si los padres no están en el conjunto y este Node es la hoja uno, entonces deberíamos incluir este Node en el conjunto. Esto es básicamente un enfoque codicioso.

También haremos un pequeño cambio en nuestro código para imprimir también los elementos establecidos.

Java

// Java Program to Find Size of the Largest Independent
// Set(LIS) in a Given an N-array Tree
import java.io.*;
import java.util.*;
 
// save the file named as GFG2.java
public class GFG2 {
   
    // declaring static list of vector.
    public static Vector<Vector<Integer> > v
        = new Vector<Vector<Integer> >();
   
    // 7 nodes initially
    public static int n = 7;
    public static void main(String[] args)
    {
        System.out.println("Initializing an n array tree");
 
        Vector<Integer> v0 = new Vector<Integer>();
        v0.add(1);
        v0.add(2);
        v.add(v0);
        Vector<Integer> v1 = new Vector<Integer>();
        v1.add(3);
        v1.add(4);
        v.add(v1);
        Vector<Integer> v2 = new Vector<Integer>();
        v2.add(5);
        v.add(v2);
        Vector<Integer> v3 = new Vector<Integer>();
        v3.add(6);
        v.add(v3);
        Vector<Integer> v4 = new Vector<Integer>();
        v.add(v4);
        v.add(v4);
        v.add(v4);
 
        /*
        the tree looks like
                                                0
                                        /        \
                                        1        2
                                         /\       /
                                         3  4      5
                                        /
                                        6
        so initially the vector looks like
        v = {
                {1,2},
                {3,4},
                {5},
                {6},
                {},
                {},
                {},
        }
        */
 
        System.out.println(
            "Finding the elements to be included in the set");
       
        // calling the function with the first node.
        int x = LIS(0);
        System.out.println("process finished and size is "
                           + x);
    }
 
    public static int LIS(int a)
    {
        // if no node is there with labelling a
        if (a >= n)
            return 0;
       
        // if it is leaf node
        if (v.get(a).size() == 0) {
            System.out.println(a);
            return 1;
        }
        // if not considering that node
        int ifno = 0;
       
        // if considering that node.
        int ifyes = 1;
       
        // since not considering this node
        // so we should call the same function
        // on the children of this node
        for (int i = 0; i < v.get(a).size(); ++i)
            ifno += LIS(v.get(a).get(i));
       
        // if including this node
        // then call the same function recursively on the
        // grand children of this node.
        for (int i = 0; i < v.get(a).size(); ++i) {
            int k = v.get(v.get(a).get(i)).size();
            --k;
            while (k >= 0) {
                ifyes += LIS(v.get(v.get(a).get(i)).get(k));
                --k;
            }
        }
       
        // if found that including this node is beneficial
        if (ifyes > ifno)
            System.out.println(a);
        return Math.max(ifyes, ifno);
    }
}
Producción

Initializing an n array tree
Finding the elements to be included in the set
6
4
6
5
4
6
5
0
process finished and size is 4

Dado que la salida muestra los elementos del conjunto más de una vez, básicamente tenemos que implementar un mapa o un tipo de datos de conjunto para obtener los elementos de forma única.

Lo segundo a tener en cuenta es que este método es un enfoque recursivo, por lo que esto puede conducir a una complejidad de tiempo exponencial. Este método se puede mejorar utilizando el enfoque DP. Podemos lograr la memorización a través de la estructura de datos del mapa.

Publicación traducida automáticamente

Artículo escrito por harshkumarchoudhary144 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *