0
点赞
收藏
分享

微信扫一扫

一篇文章让你彻底学会时间复杂度与空间复杂度

忍禁 2022-04-13 阅读 48

目录

本节目标

一、算法效率

二、时间复杂度

1、时间复杂度的概念

2、时间复杂度的表示方法

3、简单时间复杂度的计算

示例一

void Func(int N)
{
int count = 0;
for (int k = 0; k < 100; ++ k)
{
 ++count;
}
printf("%d\n", count);
}

示例二

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);
}

示例三

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);
}

4、复杂时间复杂度的计算

(1)冒泡排序的时间复杂度

void  BubbleSort(int arr[], int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

(2)二分查找的时间复杂度

int BinarySearch(int arr[], int n, int x) //n元素个数  x:要查找的数
{
	int left = 0;
	int right = n - 1;
	while (left < right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > x)
		{
			right = mid - 1;     //中间元素比x大就挪动right下标
		}
		else if (arr[mid] < x)
		{
			left = mid + 1;    //中间元素比x小就挪动left下标
		}
		else
			return mid;     //找到就返回该元素所在的下标
	}
	return 0;               //找不到就返回0
}

(3)阶乘递归的时间复杂度

long long Factorial(int N)
{
	return N < 2 ? N : Factorial(N - 1) * N;
}

以五的阶乘示例:
在这里插入图片描述

(4)斐波那契递归的时间复杂度

long long Fibonacci(size_t N)
{
	return N < 2 ? N : Fibonacci(N - 1) + Fibonacci(N - 2);
}

在这里插入图片描述

五、不同时间复杂度效率的比较

在这里插入图片描述

三、空间复杂度

1、空间复杂度的概念

2、空间复杂度的计算方法

3、常见空间复杂度的计算

(1)冒泡排序的空间复杂度

void  BubbleSort(int arr[], int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

(2)二分查找的空间复杂度

int BinarySearch(int arr[], int n, int x) //n元素个数  x:要查找的数
{
	int left = 0;
	int right = n - 1;
	while (left < right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > x)
		{
			right = mid - 1;     //中间元素比x大就挪动right下标
		}
		else if (arr[mid] < x)
		{
			left = mid + 1;    //中间元素比x小就挪动left下标
		}
		else
			return mid;     //找到就返回该元素所在的下标
	}
	return 0;               //找不到就返回0
}

(3)阶乘递归的空间复杂度

long long Factorial(int N)
{
	return N < 2 ? N : Factorial(N - 1) * N;
}

(4)斐波那契递归的空间复杂度

long long Fibonacci(size_t N)
{
	return N < 2 ? N : Fibonacci(N - 1) + Fibonacci(N - 2);
}

在这里插入图片描述

四、总结

  • 时间复杂度和空间复杂度都是用大O的渐进表示法来表示。
  • 时间复杂度看运算执行的次数,空间复杂度看变量定义的个数。
  • 递归时时间复杂度看调用的次数,空间复杂度看调用的深度。
  • 冒泡排序的时间复杂度为O(N^2),空间复杂度为O(1)。
  • 二分查找的时间复杂度为O(logN),空间复杂度为O(1)。
  • 阶乘递归的时间复杂度为O(N),空间复杂度为O(N)。
  • 斐波那契递归的时间复杂度为O(2^N),空间复杂度为O(N)。
举报

相关推荐

0 条评论