Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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));
        }
Ejemplo n.º 3
0
        /// <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);
        }