Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ilovepdf Merged Merged Removed
Ilovepdf Merged Merged Removed
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Cola c (modelo FIFO)
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900476
ESTRUCTURAS DE DATOS Y ALGORITMOS – 2019/20
Tema 2: Divide y Vencerás
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
PASOS DIVIDE Y VENCERÁS:
1. Dividir el problema en subproblemas
2. Vencer: resolver los problemas usando recursión (excepto los casos base)
3. Combinar las soluciones
CÁLCULO DE COSTES
x=talla // T(x)=coste del método recursivo
Tvencer(x>xbase) = a * Tvencer(x/c) + Tdividir(x) + Tcombinar(x)
a = Nº de llamadas recursivas
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900487
public static <T extends Comparable<T>> T[] fusion(T[] a, T[] b){
T[] res = new Comparable[a.length + b.length];
int i = 0, j = 0, k = 0;
while(i<a.length && j<b.length){
if(a[i].compareTo(b[j])<0) { // i<j
res[k++] = a[i++]; // res[k]=a[i]; k++; i++;
} else { res[k++] = b[j++]; } // res[k[=b[j], k++, j++;
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
}
//Puede ser que una de las partes no haya acabado y otra si
for(int r = i; r<a.length;r++) { res[k++] = a[r]; }
for(int r = j; r<b.length;r++) { res[k++] = b[r]; }
return res;
}
2º Método: FUSIONDYV, que es como fusión (lo de arriba) pero con 1 array
y lo ordena
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900487
Ejemplo gráfico:
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
1 2 3 4 5 6 7 8 Hemos ordenado el 7 y vemos que los
demás están también ordenados
COSTES:
-Selección directa: Θ (k*x)
-mergeSort o quickSort: Θ (x ∗ log 𝑐 𝑥)
SELECCIÓN RÁPIDA: Selecciona dónde debo situar el elemento k empezando a contar desde la posición 0
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900487
ESTRUCTURAS DE DATOS Y ALGORITMOS – 2019/20
Tema 3: Map y Tabla de Dispersión Hash
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
MODELO MAP: Es un tipo de diccionario con datos pares (Clave c, valor v). En
este diccionario no hay claves repetidas (por ejemplo, puedo utilizar un map
para obtener una lista de palabras DISTINTAS de un texto)
public interface Map <C, V> {
Coste promedio de
localizar una clave en
Map
Ejemplo: Tenemos una lista de 188 países (del 1 al 188) ordenados según su PIB
Las entradas del “Diccionario(d)” son: Clave c = nº del país; Valor v = capital
Lisboa (Portugal) está la nº 38 de la lista. Si lo queremos insertar haríamos:
d.insertar(38, “Lisboa (Portugal)”);
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900490
En resumen: d es un Map ordenado. ¿Esto qué es? Pues es como si fuese un Array
ordenado, pero el Array está compuesto por pares, es decir, elementos que van
de dos en dos, Clave y Valor. El supuesto array sería:
public Entrada<C,V> [] elArray;
¿Qué problema hay? Que para insertar tenemos que añadir/indexar en el Map, y no
se puede hacer tal cual → necesitamos una clave de dispersión adecuada, es
decir, una función de dispersión estándar → hashCode() //el DNI del objeto
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Devuelve ints, con lo que si ya está Integer no hace nada
(solo funciona de String a int)
¿Cómo obtengo el valor hash o de dispersión?
Función de dispersión (Convertimos de String a int)
Para que sea efectiva • Un String es como un Array de char (charAt(i))
elArray.length tiene • Un char i lo podemos codificar con n bits
que ser primo
En un bucle for:
EJEMPLO: VOY A INSERTAR UNA PALABRA PERO SU hashCode() ES MUY GRANDE Y NO CABE
elArray.length-1 = 46795
d.insertar(“dog”, “perro”); //c.hashCode() = 99644 > 46795
Convertimos el valor hash en una posición válida del Array:
int indiceValido = c.hashCode() % elArray.length();
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900490
¿Y SI SIGUE SIN CABER?
Aplicamos un if(indiceValido<0) {indiceValido += elArray.length;}
COLISIONES
Ocurren cuando inserto una palabra en el Map en una clave en la que ya
había una palabra y la palabra origen y la a insertar tienen distinto
valor:
!c1.equals(c2) && indiceHash(c1) == indiceHash(c2);
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
2 soluciones:
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900490
ANÁLISIS EXPERIMENTAL: TABLA DE DISPERSIÓN
(Para analizar el comportamiento de una tabla Hash de talla X (nº entradas) y
método hashCode())
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
2 métodos
40
30
izquierda, ya que
20 conforme más grande
10 es la capacidad el
0
número de colisiones
2 4 8 16
va bajando
Capacidad
16 Cuantas más
Nº mínimo de cubetas con
14 cubetas hayan de
12
longitud 0 mejor
10
esa longitud
8
6
4
2
0
8 7 6 5 4 3 2 1 0
Longitud cubeta
REHASHING
(Tenemos que usar rehashing cuando tenemos una mala estimación de la capacidad,
es decir, el FC>1)
¿Qué hace este método?
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900490
CÓMO SERÍA EN JAVA
package librerías.estructurasDeDatos.deDispersion;
public class EntradaHash<C,V> {
private C clave;
private V valor;
public entradaHash (C clave, V valor) {
this.clave = clave;
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
this.valor=valor;
}
}
public Class TablaHash <C,V> implements Map<C,V> {
protected ListaConPI<EntradaHash<C,V>>[] elArray;
protected int talla;
protected int indiceHash(C c) {…}
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900490
ESTRUCTURAS DE DATOS Y ALGORITMOS – 2019/20
Tema 4:Map ordenado y Árbol binario de búsqueda
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
MAP ORDENADO
(Es como un Map unido a una lista ordenada)
public interface MapOrdenado<C extends Comparable <C>, V> extends Map<C,V>{
public EntradaMap<C,V> recuperarEntradaMin();
public C recuperarMin();
public EntradaMap<C,V> recuperarEntradaMax();
public C recuperarMax();
public EntradaMap<C,V> sucesorEntrada(C c) ;
Θ (1)
LINEAL Θ (x) Θ (x) Θ (x) Θ (x)
Θ (x)
LINEAL
CONTIGUA Θ log 𝑥 Θ (x) Θ log 𝑥 Θ (1) Θ (1)
ORDENADA
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900489
ÁRBOL BINARIO DE BÚSQUEDA EQUILIBRADO (ABB)
(Es como un árbol binario normal, pero cumple la propiedad de búsqueda
ordenada)
NODO
RAÍZ
Mayores Menores
que el nodo que el
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
raíz nodo raíz
• recuperar(e)
• insertar(e)
•
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900489
EJEMPLO CON 1-2-3-5-7-9
Orden: 5-2-1-3-9-7
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
PASOS PARA CONSTRUIR UN ABB EQUILIBRADO A PARTIR DE UN ARRAY V ORDENADO
ASCENDENTEMENTE:
1. mitad = (elArray.length-1)/2; v[mitad] → nodo raíz
2. Construimos el hijo izquierdo, es decir, de v[0, mitad-1]. ¿Cómo lo
hacemos? Aplicamos a ese subArray v[0, mitad-1] el primer paso
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900489
Resumen-Tema-5-EDA-ESTRUCTURAS-D...
Anónimo
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Usaremos:
import librerías.estructurasDeDatos.modelos.ColaPrioridad;
import librerías.estructurasDeDatos.jerarquicos.MonticuloBinario;
COLA DE PRIORIDAD
public interface ColaPrioridad<E extends Comparable<E>>
0 1 2 3 4 5 6 7 8 9 10
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900486
protected int talla;
public MonticuloBinario (int n) {
elArray= (E[]) new Comparable(n);
talla=0;
}
public boolean esVacia() { return talla==0;}
public E recuperarMin() { return elArray[1];}
public E recuperarMax() {
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
int pos = (talla/2) +1;
E max = elArray[pos]; //cogemos la última posición
while(pos <= talla) {
if(elArray[pos].compareTo(max) >0) {
max = elArray[pos];
}
pos++;
MÉTODO INSERTAR:
1. Calcular la posición de inserción de e y verificar que el dato a insertar
(e) es mayor que su nuevo padre. La posición será talla+1 a no ser que no
cumpla ser mayor que el padre. ¿Qué pasa si no es mayor? Lo cambio por el
padre y en bucle hacemos REFLOTADO de e hasta que todos los nodos padres
sean menores que sus hijos.
2. Insertamos e
public void insertar(E e){
if (talla == elArray.length-1) { //Si no caben más
duplicarArray();
}
int posIns = talla++;
posIns = reflotar(e, posIns); //Propiedad de orden
elArray[posIns] = e; //inserto
}
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900486
protected int reflotar(E e, int pos) {
while(pos>1 && e.compareTo(elArray[pos/2])<0) { //pos/2=padre
elArray[pos] = elArray[pos/2]; //el hijo será el padre
pos = pos/2; //el antiguo padre es ahora el hijo
}
return pos;
}
MÉTODO ELIMINARMIN
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
1. Borramos el mínimo, o sea, el nodo raíz y ponemos el nodo talla en la
raíz y hacemos talla—
2. Hundimos → Es justo lo contrario que reflotar (de arriba a abajo)
3. Insertamos el dato hundido
public E eliminarMin() {
E elMinimo = elArray[1];
elArray[1] = elArray[talla--]; //elArray[1]=elArray[talla] y talla--
hundir(1);
return elMinimo;
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900486
ESTRUCTURAS DE DATOS Y ALGORITMOS – 2019/20
Tema 6: Grafos y estructuras de partición
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Grafo ponderado → Con peso
Grafo dirigido → Con flechas
MATRIZ DE ADYACENCIA
• Vértices: int
• Aristas: pares de int
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
public abstract int gradoEntrada(int i){ //NO DIRIGIDO
return gradoSalida(i);
}
public abstract int gradoSalida(int i) { //DIRIGIDO Y NO DIRIGIDO
return elArray[i].talla();
}
public abstract int numVertices(); // Θ (V)
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
public abstract int numAristas(); // Θ (V)
public abstract Boolean existeArista(int i, int j); //O (|V|)
public abstract void insertaArista(int i, int j); //O (|V|)
public abstract double pesoArista(int i, int j); //O (|V|)
public abstract void insertarArista(int i, int j, double p);
public abstract ListaConPI<Adyacente> adyadencesDe(int i);
}
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
TIPOS DE “CAMINOS”
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
DFS: EXPLORACIÓN EN PROFUNDIDAD
En la clase Grafo:
protected int[] visitados;
protected int ordenVisita;
public void preOrden(Arbol t) { preOrden(raizT);}
public void preOrden(Nodo n) {visitar(n);} //para todos los hijos de n
hacemos preOrden(hijo)
public void dFS(Grafo g) { //Para todos los vértices de V dFS(v)
visitados = new int[numVertices()];
if(visitados[v]==0) {dFS(v);}
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
BFS: BÚSQUEDA EN ANCHURA
En la clase Grafo: (Lo sombreado cambia con respecto al DFS)
protected int[] visitados;
protected int ordenVisita;
protected Cola<Integer> q;
public void porNiveles(Arbol t) { porNiveles(raizT);}
public void porNiveles(Nodo n) {
Cola<Nodo> q = new ArrayCola<Nodo>();
q.encolar();
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
while(!q.esVacia()) {
Nodo n = q.desencolar();
visitar(n);
}
}
public void bFS(Grafo g) {
Cola<Vertice> q = new Arraycola<Vertice>();
if(visitados[0]==0) { bFS(v);}
}
public void bFS(Vertice v) {
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
protected void toArrayBFS(int v, int[] res) {
res[ordenVisita] = v;
ordenVisita++;
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
q.encolar(v);
while(!q.esVacia()) {
int n = q.desencolar();
ListaConPI<Adyacente> l = adyacentesDe(v);
for(l.inicio(); !l.esFin(); l.siguiente()){
int w = l.recuperar().getDestino();
if(visitados[w] == 0) {
visitados[w] = 1;
res[ordenVisita++]=w;
q.encolar(w);
}
}
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
EL CAMINO MÁS CORTO SIN PESOS (entre dos vértices)
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
for(int v = caminoMin[w]; v!=-1;v=caminoMin[v]) {
res.inicio();
res.insertar(v);
}
}
return res;
}
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
public void dijkstra(int u) {
distanciaMin = new double[numVertices()];
caminoMin = new int[numVertices()];
for(int i=0; i<numVertices(); i++) {
// “inicializamos” distanciaMin y caminoMin
distanciaMin[i] = INFINITO;
caminoMin[i] = -1;
}
distanciaMin[u] = 0;
visitados = new int[numVertices()];
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
ColaPrioridad<VerticeCoste> qP;
qP = new MonticuloBinario<VerticeCoste> ();
qP.insertar(new VerticeCoste(u, 0)); //código = u, coste = 0
while(!qP.esVacia()){ //mientras que la cola no esté vacía
int v = qP.eliminarMin().codigo; //obtengo el código del mínimo
if(visitados[v]==0) { //si no hemos visitado el mínimo
visitados[v] = 1; //lo visitamos
//Nos creamos una lista con los adyacentes
ListaConPI<Adyacente> l = adyacentesDe(v);
for(l.inicio(); !l.esFin(); l.siguiente) {
{SO2,SO,DBD,BDA,EDA,PRG,MDA,ECT,FCO}
{FCO,ETC,MDA,PRG,EDA,BDA,DBD,SO,SO2}
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
DFS POST-ORDEN (más arriba está el pre-orden)
public int[] finDelDFS(){
int[] res = new int[numVertices()];
ordenVisita = 0;
visitados = new int[numVertices()];
for(int v = 0; v<numVertices(); v++){
if(visitados[v]==0) { finDelDFS(v, res);}
}
return res;
}
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
protected void finDelDFS(int v, int[] res) {
visitados[v] = 1;
ListaConPI<Adyacente> l = adyacentesDe(v);
for(l.inicio(); !l.esFin(); l.siguiente()){
int w = l.recuperar().getDestino();
if(visitados[w]==0) { finDelDFS(w, res);}
}
visitados[v] = 2;
res[ordenVisita] = v;
ordenVisita++;
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
//SII el grafo es un DIGRAFO (grafo dirigido)
//Lo subrayado son las diferencias con toArrayDFS()
public boolean hayCicloDFS(){
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
boolean ciclo = false;
visitados = new int[numVertices()];
for(int v = 0; v<numVertices() && !ciclo; v++){
if(visitados[v] == 0) {ciclo = hayAristaHDFS(v);}
}
return ciclo;
}
protected boolean hayAristaHDFS(int v) {
boolean aristaHA = false;
visitados[v] = 1;
ListaConPI<Adyacente> l = adyacentesDe(v);
for(l.inicio(); !l.esFin() && !aristaHA; l.siguiente()){
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
• Subgrafo de un grafo G → sus vértices y aristas son subconjuntos de
los de G
• Árbol → Grafo conexo, acíclico y no dirigido
• Bosque → Grafo acíclico y no dirigido
• Árbol de recubrimiento → Subgrafo de G que contiene a todos los
vértices de G y un árbol
• Árbol de recubrimiento mínimo → Se obtiene con el algoritmo de Prim
1. Seleccionaremos un vértice como raíz del árbol
▪ E’=0 (aún no hay aristas añadidas)
▪ V’ = {vértice seleccionado
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
2. Seleccionamos su adyacente mínimo, es decir, el adyacente que
tenga el mínimo peso
3. Añadimos el nuevo vértice a V’ y la nueva arista a E’
4. Bucle hasta que |E’| = |V|-1 (el bucle vuelve al 2.)
ALGORITMO DE PRIM
public Arista[] prim() {
visitados = new int[numVertices()];
q = new ArrayCola<Integer>();
Arista[] sTree = new Arista[numVertices() - 1];
ColaPrioridad<Arista> aristasFactibles = new
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
UF-SET: Dividir un conjunto de N elementos en tantos subconjuntos disjuntos
como establezca en él la Relación “a está conectado con b”
• PORBLEMA de la conectividad o equivalencias dinámicas
Dados los N elementos de un conjunto C, establecer y
representar las clases que determina la relación de
equivalencia (B) (2 tipos)
▪ MODELO DE GESTIÓN DE DATOS: para obtener la partición de
C realizamos
a) find(a) → obtiene la clase de equivalencia del
elemento
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
b) unión(claseA, clase) → une las 2 clases si cumplen
la relación de equivalencia
▪ ALGORITMO DE PARTICIÓN (construcción UF-SET)
a) Inicialización: Crear una partición de C en la que
cada elemento esté en una clase de equivalencia
distinta
b) Paso i: Si dos elementos de C pertenecen a la misma
clase, su unión es innecesaria (para comprobarlo
aplicaríamos un if)
c) Terminación: para cualquier elemento de C, su clase
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
FAST-UNION (Representación jerárquica en bosque, es decir, cada clase de
equivalencia la representamos con un árbol)
• El dato del nodo raíz es el representante de la clase
• Cada nodo tiene un dato de la clase y una referencia a su padre
Costes:
▪ find(i) → O (H=N)
▪ union(x, y) → Θ (1) (constante)
EJEMPLO FAST UNION
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
elArray = 6 3 9 3 3 3 8 3 8 8
El hijo de 6 es 0 → elArray[0] = 6
El hijo de 9 es 2 → elArray[2] = 9
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
COMBINAR POR RANGO
1º Tenemos que disponer del rango de cada árbol, que se guarda
en su nodo raíz en negativo y su valor es el número de nodos
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
del camino más profundo del árbol
elArray de los
grafos
Grafo 2
Grafo 1
Nuevp elArray
(fast-union)
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488
public int find(int i) {
if(elArray[i]<0) {return i;}
return elArray[i] = find(elArray[i]);
//para la compresión de caminos
}
public void union(int claseI, int claseJ){
//si son iguales (mismo rango)
if(elArray[claseI] == elArray[claseJ]) {
elArray[claseI] = claseJ; //Colgar claseI de claseJ
// “Incrementar” rango de claseJ para tener nº negativo
No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
elArray[claseJ]--;
} else {//distinto rango → no se incrementa
//si no son iguales hay que comprobar cuál es menor
if(elArray[claseI]<elArray[claseJ]) { //Negativos
elArray[claseJ] = claseI; //Colgar J de I
else {
elArray[claseI] = claseJ; //Colgar I de J
}
}
}
¿No te llega para pagar Wuolah Pro? ¿Un año sin anuncios gratis? ¡Clic aquí!
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2900488