Universidad de Pekín C Aprendizaje de idiomas Día 13

Complejidad en el tiempo de
un programa o algoritmo  La eficiencia en el tiempo de un programa o algoritmo, también conocida como "complejidad en el tiempo", a veces denominada "complejidad"
usually La complejidad generalmente se expresa mediante la letra grande O y la letra minúscula n, como O (n) , O (n2
), etc. n representa
la escala del problema .
La complejidad del tiempo se
mide por la relación entre el número de veces que se necesita realizar una determinada operación de tiempo fijo yn durante la ejecución del algoritmo . Encontrar el número de columnas en una serie desordenada, la complejidad es O (la N-)
7
La complejidad del tiempo de los programas o algoritmos de
la eficiencia del tiempo  un programa o algoritmo, también conocido como "complejidad del tiempo", a veces referido como "complejidad"
 complejo Los grados a menudo se expresan con la letra grande O y la letra minúscula n, como O (n), O (n2
), etc. n representa
la escala del problema .
La complejidad del tiempo se
mide por la relación entre el número de veces que se necesita realizar una determinada operación de tiempo fijo yn durante la ejecución del algoritmo . Encuentre un cierto número en la secuencia desordenada, la complejidad es O (n)
 Al calcular la complejidad, solo cuente el número de operaciones fijas con la mayor cantidad de ejecuciones (n es lo suficientemente grande)
. Por ejemplo, si un algoritmo necesita realizar sumas n2 veces y división n veces, entonces su complejidad es O (n2
).
8
Insertar sort
void InsertionSort (int a [], int size)
{
for (int i = 1; i <size; ++ i) {
// a [i] es el elemento desordenado más a la izquierda [i] Póngalo en una posición adecuada
para (int j = 0; j <i; ++ j)
if (a [j]> a [i]) {
// Para poner a [i] en la posición j, los elementos del subíndice original j a i-1 se mueven hacia atrás una posición
int tmp = a [i];
para (int k = i; k> j; --k)
a [k] = a [k-1];
a [j] = tmp;
break;
}
}
} // complejidad O (n2)
9
programa o La complejidad temporal del algoritmo
 Si la complejidad es la suma de múltiples funciones de n, solo importa la función que crece más rápido con el crecimiento de n
O (n3 + n2
) => O (n3
)
O (2n + n3
) => O (2n
)
O (n! + 3n
) => O (n!)
10
Complejidad de tiempo de un programa o algoritmo
 Si la complejidad es la suma de múltiples funciones de n, entonces solo importa el crecimiento con el crecimiento de n el más rápido que la función
número
O (N3 + N2
) => O (N3
)
O (2N + N3
) => O (2N
)
O (+ n-con 3N!
) => O (n-!)
l constante complejidad: O (1) El tiempo (número de operaciones) no tiene nada que ver con la escala del problema
 Complejidad logarítmica: O (log (n))
complexity Complejidad lineal: O (n)
 Complejidad polinómica: O (nk
)
 Complejidad exponencial: O (an)
complexity Complejidad factorial: O (n!) 11
Complejidad temporal de un programa o algoritmo
 Hay dos tipos de complejidad: "complejidad promedio" y "peor complejidad".
Ambos pueden ser uniformes, pueden no coincidir con
12
veces la complejidad de los programas o algoritmos
l encontrar un número en las secuencias de números aleatorios (búsqueda secuencial) O (n)
l de n puntos en el plano, entre dos puntos cualesquiera requiere una Distancia O (n2
)
 Insertar clasificación, seleccionar clasificación, clasificación de burbujas O (n2
)
sort Clasificación rápida O (n * log (n))
 Búsqueda binaria O (log (n))
13
Búsqueda binaria Zhangye
,
Gansu, Facultad de Ciencias de la Información y Tecnología
Búsqueda binaria del Gran Cañón del Lago Pingshan
 A piensa en un número entre 1-1000, B puede adivinar, puede hacer preguntas, A solo puede responder sí o no. ¿Cómo puedes
adivinar la menor cantidad de preguntas que puedes hacer?
¿Es 1? ¿Es 2? ... es 999? Pregunte 500 veces en promedio
¿Es mayor que 500? ¿Es mayor que 750? ¿Es mayor que 625? ... Cada vez que reduce la suposición a la mitad de la última vez,
solo 10 veces
15
 Escriba una función BinarySeach para encontrar elementos en la matriz int que contengan elementos de tamaño, ordenados de pequeño a grande
p, si se encuentra, devuelve el índice del elemento, si no se encuentra, devuelve -1. Complejidad requerida O (log (n))
int BinarySearch (int a [], int size, int p)
{
int L = 0; // Fin izquierdo del intervalo de búsqueda
int R = tamaño-1; // Fin derecho del intervalo de búsqueda Apunte
while (L <= R) {// Si el intervalo de búsqueda no está vacío, continúe buscando
int mid = L + (RL) / 2; // Tome el índice del elemento en el medio del intervalo de búsqueda
if (p == a [mid])
return mid;
else if (p> a [mid])
L = mid + 1; // establece el extremo izquierdo del nuevo intervalo de búsqueda
else
R = mid-1; // establece el extremo derecho del nuevo intervalo de búsqueda
}
return -1 ;
} // complejidad O (log (n))
16
función de búsqueda binaria
 escriba una función LowerBound para encontrar un índice más pequeño que el
entero dado p en la matriz int que contiene elementos de tamaño, ordenados de pequeño a grande El elemento más grande. Si se encuentra, devuelve su subíndice, si no se encuentra, devuelve -1

int LowerBound(int a[],int size,int p) //复杂度O(log(n))
{
int L = 0; //查找区间的左端点
int R = size - 1; //查找区间的右端点
int lastPos = -1; //到目前为止找到的最优解
while( L <= R) { //如果查找区间不为空就继续查找
int mid = L+(R-L)/2; //取查找区间正中元素的下标
if(a[mid]>= p)
R = mid - 1;
else {
lastPos = mid;
L = mid+1;
}
}
return lastPos;
}

17
Función de búsqueda binaria
 Nota:
int mid = (L + R) / 2; // Tome el índice del elemento medio del intervalo de búsqueda
 Para evitar que (L + R) se desborde demasiado:
int mid = L + (RL) / 2;
18
de búsqueda binaria función de
la raíz de la ecuación dicotomía
Facultad de tecnología de la información Ciencia y
Qilian paisaje
raíz de la ecuación dicotomía de
una raíz encontrar la siguiente ecuación: F (X) = X3
-5x2 + lOx-80 = 0
si las raíces calculadas son una , Entonces requiere | f (a) | <= 10-6
Solución: Derive f (x) y obtenga f '(x) = 3x2-10x + 10. De la ecuación cuadrática de la ecuación unaria, la ecuación
f '(x) = 0 no tiene solución, por lo que f' (x) siempre es mayor que cero. Por lo tanto, f (x) está aumentando monotónicamente. Es fácil saber que f (0) <0
yf (100)> 0, por lo que solo debe haber una raíz en el intervalo [0,100]. Como f (x) es
monótono en [0,100] , puede encontrar la raíz en el intervalo [0,100] de forma dicotómica.
20
dicotomía encontrar la raíz de la ecuación #include

#include <iostream>
#include <cmath>
using namespace std;
double EPS = 1e-6;
double f(double x) { return x*x*x - 5*x*x + 10*x - 80; }
int main() {
double root, x1 = 0, x2 = 100,y;
root = x1+(x2-x1)/2;
int triedTimes = 1; //记录一共尝试多少次,对求根来说不是必须的
y = f(root);
while( fabs(y) > EPS) {
if( y > 0 ) x2 = root;
else x1 = root;
root = x1+(x2 - x1)/2;
y = f(root);
triedTimes ++;
}
printf("%.8f\n",root);
printf("%d",triedTimes);
return 0;
}

21
5.70508593
32
ejemplos
Encontrar un par entero de suma específica Qinghai Lake
School of Information Science and Technology Ejemplo encontrar un par entero de suma específica Ingrese n (n <= 100,000) enteros y encuentre dos de ellos, la suma de los cuales es igual al entero m (supuesto Debe haber una solución). Todas las preguntas pueden ser representados por un int número entero 23 es ejemplo: un número entero de la especificada y entrada de n (n <= 100,000) número entero, para encontrar los dos números en el que número entero m es igual (asumiendo Ken establece la solvencia) . Todos los números enteros en la pregunta pueden ser representados por int. Solución 1: Use un doble ciclo para enumerar todos los métodos de acceso. La complejidad es O (n2 ). for (int i = 0; i <n-1; ++ i) for (int j = i + 1; j <n; ++ j) if (a [i] + a [j] == m) break ; 100,0002 = 10 mil millones, envíe o participe en varios concursos de programación en varios OJ, ¡tal complejidad se agota ! 24 problemas de ejemplo: Encuentre el par entero de la suma especificada Ingrese n (n <= 100,000) enteros, encuentre dos de ellos y su suma es igual al entero m (suponiendo que debe haber una solución). Todos los enteros en la pregunta se pueden expresar con int Solución 2:




















  1. Ordenar la matriz, la complejidad es O (n × log (n))
  2. Para cada elemento a [i] en la matriz, busque ma [i] en la matriz para ver si se puede encontrar. La complejidad de log (n), lo
    peor es encontrar n-2 veces, por lo que la complejidad de encontrar esta parte también es O (n × log (n)).
    La complejidad total de esta solución es O (n × log (n)) De
    25
    problema de ejemplo: Encuentre el par entero de la suma especificada
    Ingrese n (n <= 100,000) enteros, encuentre dos de ellos y su suma es igual al entero m (suponiendo
    que debe haber una solución). Todos los enteros en la pregunta se pueden expresar con int
    Solución 3:
  3. Ordenar la matriz, la complejidad es O (n × log (n))
  4. Al buscar, establezca dos variables i y j, el valor inicial de i es 0 y el valor inicial de j es n-1. Observando a [i] + a [j], si es mayor que m, deje j
    menos 1, si es menor que m , Deje que aumente en 1 hasta que a [i] + a [j] = m.
    La complejidad total de esta solución es O (n × log (n)).
    26
    preguntas de ejemplo
    Vacas agresivas Fotografía aérea
    de la Facultad de Ciencias de la Información y Tecnología
    Lago Qinghai
    Ejemplo 2 Bailian 2456: Vacas agresivas
    28
    http://bailian.openjudge.cn/practice/2456 El
    granjero John construyó un largo corral, que incluye N (2≤ N≤100,000) compartimentos,
    la ubicación de estos compartimentos pequeños es x0
    , ..., xN-1 (0≤xi≤1,000,000,000, todos los enteros, diferentes)
    John C (2≤C≤N) Cada cabeza está dividida en un compartimento. Niu ambos esperan mantenerse alejados el uno del otro para no
    molestarse. ¿Cómo puede ser la distancia mínima entre dos vacas lo más grande posible, y cuál es la
    distancia mínima máxima ?
    Ejemplo 2
    29
     Solución 1:
    Primero obtenga las coordenadas ordenadas del compartimento x0
    , ..., xN-1
    de 1,000,000,000 / C a 1 e intente esta "distancia máxima más cercana" D por turno. La
    primera posible encontrada es la respuesta.
    Método de prueba:
  5. La primera vaca se coloca en x0
  6. Si la vaca kth se coloca en xi, encuentre la primera Xj en xi + 1 a xN-1 en [xi + D, 1,000,000,000],
    y la vaca k + 1th se coloca en Xj. Si no se puede encontrar tal Xj
    , D = D-1, vaya a 1) Inténtelo de nuevo.
    Si todas las vacas se pueden bajar, entonces D es la respuesta.
    Ejemplo 2
    30
     Solución 1:
    Primero obtenga la coordenada del compartimento ordenado x0
    , ..., xN -1
    Pruebe esta "distancia máxima más cercana" D en orden de 1,000,000,000 / C a 1, y la
    primera posible es la respuesta.
    Método de prueba:
  7. La primera vaca se coloca en x0
  8. Si la vaca kth se coloca en xi, encuentre la primera Xj en xi + 1 a xN-1 en [xi + D, 1,000,000,000],
    y la vaca k + 1th se coloca en Xj. Si no
    se encuentra tal Xj , D = D-1, vaya a 1) Inténtelo de nuevo.
    Si todas las vacas pueden ser apagadas, entonces D es la respuesta. ¡La
    complejidad es 1,000,000,000 / C * N, que es 1,000,000,000, tiempo de espera!
    Ejemplo 2
    31
     Solución 2:
    Primero obtenga las coordenadas ordenadas del compartimento x0
    , ..., xN-1
    en [L, R] usando la dicotomía para probar la "distancia más cercana máxima" D = (L + R) / 2 (el valor inicial de L, R es
    [1, 1,000,000,000 / C]
    Si D es factible, recuerde la D, y luego continúe intentando en el nuevo [L, R] (L = D + 1)
    Si D no es factible, continúe intentando en el nuevo [L, R] (R = D-1)
    registro de complejidad (1,000,000,000 / C) * N
193 artículos originales publicados · Me gusta 66 · Visitas 10,000+

Supongo que te gusta

Origin blog.csdn.net/qq_42403069/article/details/105549819
Recomendado
Clasificación