public HashSet<AristaEj4> conflictos() throws Exception { HashSet<AristaEj4> res = new HashSet<AristaEj4>(); for (NodoConVecinos n : this._vecinos) { if (n.getColor() == this.getColor()) res.add(new AristaEj4(n, this)); } return res; }
public int cantConflictos() { // Total: O(cantidad de vecinos), que es O(n) Integer res = 0; // O(1) for (NodoConVecinos n : this._vecinos) { // O(n) iteraciones if (n.getColor() == this.getColor()) // O(1) res += 1; // O(1) } return res; // O(1) }
public LinkedList<NodoConVecinos> posiblesSwaps() { // total: O(n*c) LinkedList<NodoConVecinos> res = new LinkedList<NodoConVecinos>(); // O(1) for (NodoConVecinos n : this._vecinos) { // O(n) iteraciones. if (n.getColor() != this.getColor()) { // O(1) if ((n.get_coloresPosibles().contains(this.getColor())) && this.get_coloresPosibles().contains(n.getColor())) // O(c) res.add(n); // O(1) } } return res; // O(1) }
public Hashtable<Integer, ArrayList<NodoConVecinos>> conflictosPorColor() { // O(n) Hashtable<Integer, ArrayList<NodoConVecinos>> conflictosPorColor = new Hashtable<Integer, ArrayList<NodoConVecinos>>(); // O(1) for (int color : this.get_coloresPosibles()) { // O(c) ArrayList<NodoConVecinos> vacia = new ArrayList<NodoConVecinos>(); conflictosPorColor.put(color, vacia); } for (NodoConVecinos v : this.vecinos()) { // O(n) iteraciones if (conflictosPorColor.containsKey(v.getColor())) { // O(c) pero amortiza a O(1) ArrayList<NodoConVecinos> nuevovalor = conflictosPorColor.get(v.getColor()); nuevovalor.add(v); conflictosPorColor.put(v.getColor(), nuevovalor); } } return conflictosPorColor; }
public Swap buscarMejorSwap() { // O(n*c + n*n) LinkedList<NodoConVecinos> candidatos = this.posiblesSwaps(); // O(n*c) NodoConVecinos mejorSwap = null; // O(1) int mejorMejora = 0; // O(1) int conflictosPropios = this.cantConflictos(); // O(n) for (NodoConVecinos v : candidatos) { // O(n) iteraciones. Total: O(n*n) int conflictosSinSwap = conflictosPropios + v.cantConflictos(); // O(n) this.swapColor(v); // hago swap de colores (sin cambiar otras estructuras). O(1) int conflictosConSwap = this.cantConflictos() + v.cantConflictos(); // O(n) this.swapColor(v); // revierto el swap de colores O (1) if (conflictosConSwap < conflictosSinSwap) { // O(1) if ((conflictosSinSwap - conflictosConSwap) > mejorMejora) { // O(1) mejorSwap = v; // O(1) mejorMejora = conflictosSinSwap - conflictosConSwap; // O(1) } } } return new Swap(mejorSwap, mejorMejora); }
private void swapColor(NodoConVecinos otro) { int otroColor = otro.getColor(); otro.setColor(this.getColor()); this.setColor(otroColor); }