当前位置:网站首页>Les milliardaires, les riches, ont dit au petit Manon que vous aviez une grande complexité spatiale et temporelle.

Les milliardaires, les riches, ont dit au petit Manon que vous aviez une grande complexité spatiale et temporelle.

2021-10-14 08:07:03 Petit Manon UU

A l'attention des riches.,Je me suis empressé d'écrire cet article sur la complexité spatio - temporelle

Article de liaison La Reine de plus d'un milliard de dollars a - t - elle dit au petit Manon que l'interruption serait

Qu'est - ce qu'une structure de données

Est de réaliser des projets , Les données doivent être stockées en mémoire

Complexité temporelle et spatiale de l'algorithme

1.Efficacité de l'algorithme

2.Complexité temporelle

3.Complexité spatiale

4. Complexité temporelle commune et complexité ojExercice

1.Efficacité de l'algorithme

Comment mesurer la qualité d'un algorithme

Comme la séquence Fibonacci ci - dessous

long long Fib(int N)
{
    
    if(N < 3)
    	return 1;
    return Fib(N-1) + Fib(N-2);
}

Complexité de l'algorithme

Après avoir écrit l'algorithme comme exécutable, L'exécution prend du temps, des ressources et de l'espace (Mémoire)Ressources . Donc mesurer la qualité d'un algorithme ,Généralement à partir deTempsEtEspaceDeux dimensions., C'est - à - dire la complexité temporelle et spatiale .
==La complexité temporelle mesure principalement la vitesse et la lenteur d'un algorithme, Et la complexité spatiale mesure principalement l'espace supplémentaire nécessaire au fonctionnement d'un algorithme .==Au début du développement de l'informatique,La capacité de stockage de l'ordinateur est très faible.Donc C'est très important pour la complexité de l'espace.Mais avec le développement rapide de l'industrie informatique,La capacité de stockage de l'ordinateur a atteint un niveau élevé.Nous n'avons donc plus besoin d'accorder une attention particulière à la complexité spatiale d'un algorithme.

Complexité temporelle

Le concept de complexité temporelle

Définition de la complexité temporelle:En informatique,La complexité temporelle de l'algorithme est une fonction,Il décrit quantitativement le temps de fonctionnement de l'algorithme.Le temps qu'il faut pour exécuter un algorithme,En théorie,,On ne peut pas compter,Il n'y a que vous qui lancez votre programme sur la machine,Pour savoir.Mais avons - nous besoin de tester chaque algorithme en ligne?Oui, tout peut être testé à l'ordinateur,Mais c'est gênant,C'est pour ça qu'il y a cette méthode d'analyse de la complexité temporelle.Le temps consacré à un algorithme est proportionnel au nombre de fois où l'instruction est exécutée,Nombre d'opérations de base effectuées dans l'algorithme,Est la complexité temporelle de l'algorithme.

Attention!:

1. Ici, la fonction est une expression mathématique de la fonction avec l'inconnu ,

2. Et le temps dont nous parlons n'est pas une seconde , Ça veut dire plusieurs fois

Parce que la machine est différente (Oui.2Nucléaire, Il y a un noyau ), Le temps de fonctionnement spécifique est différent , Il n'y a donc aucun moyen de mesurer la complexité du temps avec le temps

// Veuillez calculerFunc1Moyenne++countCombien de fois l'instruction a - t - elle été exécutée au total??
void Func1(int N)
{
    
    int count = 0;
    for (int i = 0; i < N ; ++ i)
    {
    
    	for (int j = 0; j < N ; ++ j)
        {
    
       	 	++count;
        }
    }
        for (int k = 0; k < 2 * N ; ++ k)
        {
    
      		++count;
        }
        int M = 10;
        while (M--)
        {
    
            ++count;
        }
    printf("%d\n", count);
}

image-20211010190548808

Dans la pratique, nous calculons la complexité temporelle,Nous n'avons pas vraiment besoin de calculer le nombre exact d'exécutions, Et il suffit de Nombre approximatif d'exécutions ,Donc ici nous utilisons bigOReprésentation progressive de.

GrandOReprésentation progressive de

GrandOSymbole(Big O notation):Est un symbole mathématique utilisé pour décrire le comportement progressif d'une fonction.

Grande dérivationOMéthode de l'ordre:

1.Avec des constantes1Remplace toutes les constantes d'addition dans le temps d'exécution

2.Dans la fonction Runtime modifiée,Seuls les termes de l'ordre le plus élevé sont conservés.

3.Si le terme d'ordre le plus élevé existe et n'est pas1,Supprimer la constante multipliée par cet élément.Le résultat est grand.OÉtapes

D'autres algorithmes ont la meilleure complexité temporelle,Moyenne et scénario le plus défavorable

==Dans le pire des cas:==Nombre maximum d'opérations à n'importe quelle échelle d'entrée(Limite supérieure)

==Moyenne:==Nombre prévu d'opérations à n'importe quelle échelle d'entrée

==Au mieux:==Nombre minimum d'opérations à n'importe quelle échelle d'entrée( La prochaine fois )

Dans la pratique, la situation générale concerne le pire fonctionnement de l'algorithme,Donc la complexité temporelle des données de recherche dans le tableau estO(N)

Exemple

Exemple1

// CalculFunc2La complexité temporelle de?
void Func2(int N)
{
	int count = 0;
	for (int k = 0; k < 2 * N; ++k)
	{
		++count;
	}
	int M = 10;
	while (M--)
	{
		++count;
	}
	printf("%d\n", count);
}

image-20211010192257554

Exemple2

// CalculFunc3La complexité temporelle de?
void Func3(int N, int M)
{
    
	int count = 0;
	for (int k = 0; k < M; ++k)
	{
    
		++count;
	}
	for (int k = 0; k < N; ++k)
	{
    
		++count;
	}
	printf("%d\n", count);
}

image-20211010193507709

Exemple3

// CalculFunc4La complexité temporelle de?
void Func4(int N)
{
    
	int count = 0;
	for (int k = 0; k < 100; ++k)
	{
    
		++count;
	}
	printf("%d\n", count);
}

image-20211010194233192

Exemple4

// CalculstrchrLa complexité temporelle de?
const char* strchr(const char* str, int character);

image-20211010202110950

Exemple5

#include<stdio.h>
// CalculBubbleSortLa complexité temporelle de?
void BubbleSort(int* a, int n)
{
    
	assert(a);
	for (size_t end = n; end > 0; --end)
	{
    
		int exchange = 0;
		for (size_t i = 1; i < end; ++i)
		{
    
			if (a[i - 1] > a[i])
			{
    
				Swap(&a[i - 1], &a[i]);
				exchange = 1;
			}
		}
		if (exchange == 0)
			break;
	}
}

image-20211010203746705

Exemple6

La complexité du calcul du temps ne peut pas se limiter à quelques couches de boucles , Et pour voir ses pensées

// CalculBinarySearchLa complexité temporelle de?
int BinarySearch(int* a, int n, int x)
{
    
	assert(a);
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
    
		int mid = begin + ((end - begin) >> 1);
		if (a[mid] < x)
			begin = mid + 1;
		else if (a[mid] > x)
			end = mid;
		else
			return mid;
	}
	return -1;
}

image-20211012081305608

Exemple7

#include<stdio.h>
// Calculer la récursion factorielleFacLa complexité temporelle de?
long long Fac(size_t N)
{
    
	if (0 == N)
		return 1;
	return Fac(N - 1) * N;
}

image-20211012082935548

Exemple8

Nous devons savoir que la complexité du temps le temps n'est pas réutilisé

#include<stdio.h>
// Calculer la récursion FibonacciFibLa complexité temporelle de?
long long Fib(size_t N)
{
    
  if (N < 3)
      return 1;
  return Fib(N - 1) + Fib(N - 2);
}

image-20211012123848021

Complexité spatiale

La complexité spatiale est également une expression mathématique,Est un algorithme en cours d'exécution== Mesure de la taille de l'espace de stockage supplémentaire temporairement occupé .==La complexité spatiale n'est pas ce que le programme prendbytesDe l'espace,Parce que ça n'a pas beaucoup de sens,Donc la complexité spatiale compte le nombre de variables.Les règles de calcul de la complexité spatiale sont essentiellement similaires à celles de la complexité pratique,Utilisez aussi BigOReprésentation progressive

Attention!

Espace de pile nécessaire à l'exécution de la fonction(Paramètres de stockage、Variables locales、 Quelques informations sur les registres, etc ) Déterminé lors de la compilation , Par conséquent, la complexité spatiale est principalement déterminée par l'espace supplémentaire explicitement appliqué par la fonction au moment de l'exécution .

Exemple

Exemple1

#include<stdio.h>
// CalculBubbleSortLa complexité spatiale de?
void BubbleSort(int* a, int n)
{
    
	assert(a);
	for (size_t end = n; end > 0; --end)
	{
    
		int exchange = 0;
		for (size_t i = 1; i < end; ++i)
		{
    
			if (a[i - 1] > a[i])
			{
    
				Swap(&a[i - 1], &a[i]);
				exchange = 1;
			}
		}
		if (exchange == 0)
			break;
	}
}

image-20211012104906697

Exemple2

#include<stdio.h>
// CalculFibonacciLa complexité spatiale de?
// Renvoie le début de la séquence FibonaccinItem (s)
long long* Fibonacci(size_t n)
{
    
	if (n == 0)
		return NULL;
	long long* fibArray = (long long*)malloc((n + 1) * sizeof(long long));
	fibArray[0] = 0;
	fibArray[1] = 1;
	for (int i = 2; i <= n; ++i)
	{
    
		fibArray[i] = fibArray[i - 1] + fibArray[i - 2];
	}
	return fibArray;
}

image-20211012130110575

Exemple3

La consommation de cadres de pile dépend de la profondeur récursive

#include<stdio.h>
// Calculer la récursion factorielleFacLa complexité spatiale de?
long long Fac(size_t N)
{
    
	if (N == 0)
		return 1;
	return Fac(N - 1) * N;
}

image-20211012141720594

La pile n'est pas grande

image-20211012143230921

Exemple4

L'espace est réutilisable , Non cumulatif . Le temps n'est pas réutilisé , Cumul . Cette phrase est complexe dans le temps , L'essence de la complexité spatiale

#include<stdio.h>
// Calculer la récursion FibonacciFibLa complexité spatiale de?
long long Fib(size_t N)
{
    
  if (N < 3)
      return 1;
  return Fib(N - 1) + Fib(N - 2);
}

image-20211012145011757

Contraste de complexité commun

image-20211012145219139

ComplexeOJExercice

1.Les chiffres disparus

image-20211012145801538

**Pensée 1:** Beaucoup de gens pensent à trier et à traverser de petits à grands qsortVite!–》Complexité temporelleO(N*log2N), Non - respect manifeste des conditions

**Deuxième idée:** Cette idée est associée à un indice de tableau , Une bonne base pour les tableaux est aussi une curiosité ,(0+1+2+…+n)-(nums[0]+nums[1]+nums[2]+…+nums[n-1])

image-20211012154951079

**Pensée 3:** Et c'est très similaire à l'idée ci - dessus ,Créer un(n+1)Tableau

image-20211012155611491

**Pensée 4:** Les questions d'entrevue Google sont similaires Créer une variablex=0,JeanxAvec[0,n] Tout est différent ou une fois ,Et puis, Xor une fois dans le tableau , Et puis le dernier numéro est Xor ,Enfin.x C'est le nombre qui nous manque Nous savons qu'il n'y a pas de différence ou de différence entre deux nombres identiques

image-20211012164629597

2.Tableau de rotation

image-20211012165755410

Avez - vous remarqué que la pensée haha est toujours une pratique pour les étudiants de l'Université , Toujours une solution violente , Simple et grossier

**Pensée 1:** Résolution violente de la rotation kUne fois La complexité temporelle estO(N*K) Complexité spatialeO(1)

**Deuxième idée:** Créer un espace supplémentaire , L'espace en échange du temps , C'est aussi une meilleure façon de Complexité temporelleO(N) Complexité spatialeO(N), Mais ne répond pas aux exigences du sujet , L'espace dépasse

**Pensée 3:**C'est génial.,In《 La culture de base du programmeur 》 On dirait qu'il y a un problème Trois pas en arrière, Avant de tourner , Tourne derrière , Et puis tout tourne La méthode efficace que Big Bull a inventée

Complexité temporelleO(N) Complexité spatialeO(1)

image-20211012175046826

Article de liaison La Reine de plus d'un milliard de dollars a - t - elle dit au petit Manon que l'interruption serait

版权声明
本文为[Petit Manon UU]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/10/20211014080136779v.html

随机推荐