¿Por búsqueda basada descarga rápida de grandes cantidades de tiempo complejidad k es O (n)

Todos sabemos que un gran número para encontrar la primera k no es un método muy utilizado es el basado fila rápida de búsqueda, pensando fila rápida con esencialmente la misma, de la siguiente manera:

    público  int findKthLargest ( int [] nums, int k) {
         retorno (findKthNum (nums, 0, nums.length-1, k-1 ));
    }

    privado  int findKthNum ( int [] nums, int izquierda, int derecha, int k) {
         int Stan = nums [derecha];
        int i = izquierdo, J = derecha;
        si (a la izquierda == derecha && dejó == k) {
             retorno nums [Izquierda];
        }
        más {
             mientras que (i < j) {
                 mientras que (i <j && nums [i]> = Stan) {
                    i ++ ;
                }
                mientras que (i <j && nums [j] <= Stan) {
                    j - ;
                }
                int temp = nums [i];
                nums [i] = nums [j];
                nums [j] = temp;
            }
        }
        nums [right] = nums [i];
        nums [i] = Stan;
        si (k < i) {
             regrese findKthNum (nums, izquierda, i - 1 , k);
        }
        otra cosa  si (k> i) {
             volver findKthNum (nums, i + 1 , a la derecha, k);
        }
        else {
             retorno nums [i];
        }
    }

de puntas abiertas debido a que cada uno de los lados solamente proceder, la complejidad de tiempo es O (n).

Pero se acaba de explicar era un poco confuso, no calculando difícil de entender por qué es O (n), por ejemplo, incluso si cada operan solamente en un lado, entonces el número de recorrido también ingrese los n- tiempos de recorrido es O ( n), es engañosa para el método es O (nlog el n- ).

Así que aquí está para volver a la complejidad del tiempo de recurrencia especializada fórmula arriba.

Todos sabemos que la ordenación rápida de ideales, y la complejidad promedio de tiempo es O (n log la N- ), su fórmula de recurrencia es el siguiente, con la combinación de tipo básicamente el mismo, pero con un promedio de ideal o limitado debido a la peor fila rápida es O (n ^ 2)

El caso promedio: T (n-) = 2 * T (n- / 2) + n-; primera división

      = 2 * (2 * T ( n / 4) + n / 2) + n; una segunda división (. T = 2 * 2 ^ (/ n- 4) + 2 * n-)

      = 2 * (2 * (2 * T (n / 8) + n / 4) + n / 2) + n; tercera división (... = 2 * T * 3 (/ n- 8) 3 * + n-)

      = .....................

      M + m ^ 2 = * N-; m-ésimo divididos

Desde 2 ^ = n-m, que es equivalente a m + n- * = n-
Así m = logN, por lo que T (n) = n + n      * logn;

Aquí es muy fácil de entender, y para buscar en base a la complejidad del tiempo de un gran número de k-fila rápida de la siguiente manera:

El caso promedio: T (n-) = T (n- / 2) + n-; primera división

      T = (. / N- 4) n- + / 2 + n-; segunda división  

      T = (. / N- 8) + n- / n- 4 + / 2 +. N-; tercera división

      = .....................

      T = (n- / n-) 4 + + 2 + ... +. N-; m-ésimo divididos

Es una serie de fórmula de sumación geométrico, está claro que T (n-) = 2N

Por lo tanto, la complejidad tiempo de cálculo de acuerdo con la fórmula de recurrencia es preferiblemente estrictos, esta nota basado en la k-ésima fila rápido encontrar un gran número, la complejidad tiempo promedio es también O (n).

"Introducción a los algoritmos," Introducción a la siguiente peor caso es O (n) del procedimiento, no se describe en detalle en este documento, la referencia http://blog.chinaunix.net/uid-26456800-id-3407406.html

 

Supongo que te gusta

Origin www.cnblogs.com/liusandao/p/12512391.html
Recomendado
Clasificación