¿Cómo encontrar todos los pares (a, b) y (c, d) en una matriz que satisfacen ab = cd con complejidad tiempo O (N $ ² $) utilizando un tipo de datos hashmap

drew181:

Dada una lista de números enteros, ¿cómo puede todos los pares (es decir axb = cxd;. Tal que a = b = c = e!!!) Se encuentran bajo complejidad de tiempo mínimo?

He intentado usar un tipo de datos HashMap, que básicamente hace el cálculo del producto, comprueba si ya se ha encontrado dentro de un HashMap, y si es que atribuye el valor del contador de incremento de la anidado para los lazos con el tipo de objeto par se encuentra dentro hashMap.

Pair es un objeto almacenar el índice de los primer y segundo números en un par. El HashMap almacena el producto como la clave y el par como el valor.

El problema con mi código es que cuando se trata de la siguiente escenario ...

axb = cxd = exf

... que no funciona debido al hecho de que sólo tiene los siguientes enlaces ...

axb = cxd y axb = exf

... y es incapaz de alcance:

cxd = exf

Por ejemplo la siguiente matriz produce resultados incorrectos:

int[] A = {1,2,3,4,6,12};

Espero que el único problema es debido a un HashMap Sólo se necesita un valor para una clave dada. He tratado de cambiar tal vez la declaración HashMap a un array de pares, pero rápidamente me di cuenta que iba a necesitar para añadir otro bucle, y aumentando así la complejidad del tiempo.

Alguna idea de lo que puedo hacer para mantener la O (N ²) y proporcionar resultados correctos?

Slawomir Chodnicki:

Mi opinión en ello:

Almacenar un conjunto de pares de cada producto. Esto debe hacerse cargo de los duplicados. Es necesario considerar pares iguales si consisten en los mismos números.

import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;

public class Main {

  static int[] data = {1,2,3,4,6,12};

  static class Pair {

    public Pair(int x, int y) {
      this.x = x;
      this.y = y;
    }

    public int x;
    public int y;

    @Override
    public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;
      Pair pair = (Pair) o;
      return
        x == pair.x && y == pair.y ||
        x == pair.y && y == pair.x;
    }

    @Override
    public int hashCode() {
      return Objects.hash(x * y);
    }
  }

  public static void main(String[] args){

    HashMap<Integer, HashSet<Pair>> products = new HashMap<>();

    // index all pairs by product in o^2 loop
    for (int i=0;i<data.length;i++){
      for (int j=i+1;j<data.length;j++){
        int a = data[i];
        int b = data[j];
        Integer p = a*b;
        if (!products.containsKey(p)){
          products.put(p, new HashSet<>());
        }
        HashSet<Pair> knownPairs = products.get(p);
        Pair pair = new Pair(a, b);
        knownPairs.add(pair);
      }
    }

    // output results
    for (Integer product: products.keySet()) {
      System.out.print("product: "+product+" -");
      HashSet<Pair> pairs = products.get(product);
      for (Pair pair : pairs) {
        System.out.print(" "+pair.x+"x"+pair.y);
      }
      System.out.println();
    }


  }

}


Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=207724&siteId=1
Recomendado
Clasificación