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.

Seleccionar n elementos de un conjunto de subconjuntos.

Estoy preguntándome si existe un algoritmo que pueda resolver este problema:

Suponga que tiene un conjunto con conjuntos en él donde cada conjunto puede o no tener elementos. Por ejemplo, supongamos que los posibles elementos de los conjuntos son 1, 2 y 3, entonces tendríamos, por ejemplo, un conjunto como {{1,2,3}{1}{1,2} … }. Entonces, ¿cómo selecciono un número de conjuntos de manera que tenga “n” elementos de cada ítem? Por ejemplo, si n=200, entonces quiero tener 200 “1s”, 200 “2s” y 200 “3s” en este ejemplo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, existe un algoritmo que puede resolver este problema. Una forma de resolver este problema es utilizar un algoritmo voraz (greedy). Aquí están los pasos para resolver este problema utilizando un algoritmo voraz:

    1. Crear tres diccionarios, uno para cada elemento (1, 2 y 3), que mantienen un conteo del número de veces que el elemento aparece en todos los conjuntos.
    2. Ordenar los conjuntos en orden descendente de su tamaño.

    3. Inicializar una lista vacía para almacenar los conjuntos seleccionados.

    4. Para cada elemento, seleccionar conjuntos de la siguiente manera:
      a. mientras el conteo del elemento en los diccionarios sea menor que n, seleccionar el conjunto con el tamaño más grande que contiene el elemento y agregarlo a la lista de conjuntos seleccionados.
      b. si no se encuentra ningún conjunto que contenga el elemento, entonces devolver False ya que no hay suficientes elementos para seleccionar.

    5. Devolver la lista de conjuntos seleccionados.

    La complejidad temporal de este algoritmo es O(kn log(kn)), donde k es el número de conjuntos y n es el número de elementos requeridos. La complejidad espacial es O(kn).

    Aquí está el código en Python para este algoritmo:

    def select_sets(sets, n):
        counts = [{}, {}, {}]
        for s in sets:
            for i in range(3):
                if i+1 in s:
                    counts[i][s] = len(s & set([i+1]))
    
        selected_sets = []
        for i in range(3):
            while sum(counts[i].values()) < n:
                found = False
                for s in sorted(counts[i], key=lambda x: -len(x)):
                    if counts[i][s] + sum(counts[i].values()) < n:
                        counts[i][s] += len(s & set([i+1]))
                        selected_sets.append(s)
                        found = True
                        break
                if not found:
                    return False
    
        return selected_sets
    

Comments are closed.