/// <summary> /// Divide el problema K-esimo en un problema K-esimo de menor tamaño /// </summary> /// <param name="p"></param> /// <returns></returns> public override Problema[] Divide(Problema p) { PKesimo m = (PKesimo)p; T piv = a[m.i];//optimizable con la pseudoMediana PosPiv suv = pivotar(piv, m.i, m.j); int u = suv.u, v = suv.v; PKesimo[] subp = new PKesimo[1]; if ((m.i + m.k - 1) < u) { subp[0] = new PKesimo(m.i, u - 1, m.i + m.k - 1, false); } else { if ((v - m.i + 1) < m.k) { subp[0] = new PKesimo(v + 1, m.j, m.k - v + m.i - 1, false); } else { subp[0] = new PKesimo(m.i, m.j, m.k, true); } } return(subp); }
/// <summary> /// Resuelve el caso trivial de K-esimo /// </summary> /// <param name="p"></param> /// <returns></returns> public override Solucion resuelveCasoBase(Problema p) { PKesimo m = (PKesimo)p; if (!m.EnMedio) { MergeSort <T> ord = new MergeSort <T>(); ord.Ordenar(a, m.i, m.j);//nlogn } return(new SKesimo(m.i - m.k - 1)); }
/// <summary> /// Revisa si es el caso base del problema K-esimo /// </summary> /// <param name="p"></param> /// <returns></returns> public override bool esCasoBase(Problema p) { PKesimo m = (PKesimo)p; return(m.EnMedio || (m.j - m.i + 1) <= this.umbral); }