【Java 数据结构】时间和空间复杂度

🔥 博客主页🔥 :【 坊钰_CSDN博客

欢迎各位点赞👍 评论**✍收藏⭐**

目录

[1. 算法效率](#1. 算法效率)

[2. 时间复杂度](#2. 时间复杂度)

[2.1 时间复杂度的定义](#2.1 时间复杂度的定义)

[2.2 大O的渐进表示法](#2.2 大O的渐进表示法)

[2.3 推导大O渐进法](#2.3 推导大O渐进法)

[2.4 常见算法的时间复杂度](#2.4 常见算法的时间复杂度)

[2.4.1 冒泡排序](#2.4.1 冒泡排序)

[2.4.2 斐波那契数](#2.4.2 斐波那契数)

[2.4.3 二分查找](#2.4.3 二分查找)

[3. 空间复杂度](#3. 空间复杂度)

[3.1 常见算法空间复杂度](#3.1 常见算法空间复杂度)

[3.1.1 冒泡排序](#3.1.1 冒泡排序)

[3.1.2 斐波那契数](#3.1.2 斐波那契数)

[4. 小结](#4. 小结)


1. 算法效率

在以后 Java 编程中,肯定会接触许多算法,那么如何衡量一个算法的到底好不好呢?

那这时候,就要分析算法的效率了,算法效率一般分为两种,一种为时间复杂度,一种为空间复杂度,这两个是用来判断算法效率的两个准则!!!

2. 时间复杂度

2.1 时间复杂度的定义

时间复杂度可不是仅仅是算法运行了多久时间,而是算法运行了多少次数,算法中的基本操作的执行次数,为算法的时间复杂度

2.2 大O的渐进表示法

大O渐进法是用来描述时间复杂度的方法

下列算法的时间复杂度,用大O渐进法表示

java 复制代码
public void fun(int n) {
        int count = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                count++;
            }
        }
    }
  • 该算法的时间复杂度为 O(n^2)

2.3 推导大O渐进法

  • 如果算法的执行次数为常数,那么就用 1 来表示,O(1)
  • 在得到算法执行的次数时,一般只保留最高阶项
  • 保留最高阶项时,该项的常数默认为 1

2.4 常见算法的时间复杂度

2.4.1 冒泡排序

java 复制代码
void BubbleSort(int* arr, int n)
{
	int end = n;
	while (end)
	{
		int flag = 0;
		for (int i = 1; i < end; ++i)
		{
			if (arr[i - 1] > arr[i])
			{
				int tem = arr[i];
				arr[i] = arr[i - 1];
				arr[i - 1] = tem;
				flag = 1;
			}
		}
		if (flag == 0)
		{
			break;
		}
		--end;
	}
}
  • 时间复杂度为---> O(n^2)

2.4.2 斐波那契数

java 复制代码
int fib(int n){
    if(n<2)  return n;
	return   fib(n-1)+fib(n-2); 
}
  • 时间复杂度为---> O(2^n)

2.4.3 二分查找

java 复制代码
int binarySearch(vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}
  • 时间复杂度为---> O(log n)

3. 空间复杂度

空间复杂度也不是算法所占的内存空间,而是创建临时变量的个数,也是使用大O的渐进法来表示

3.1 常见算法空间复杂度

3.1.1 冒泡排序

java 复制代码
void BubbleSort(int* arr, int n)
{
	int end = n;
	while (end)
	{
		int flag = 0;
		for (int i = 1; i < end; ++i)
		{
			if (arr[i - 1] > arr[i])
			{
				int tem = arr[i];
				arr[i] = arr[i - 1];
				arr[i - 1] = tem;
				flag = 1;
			}
		}
		if (flag == 0)
		{
			break;
		}
		--end;
	}
}
  • 空间复杂度---> O(1)

3.1.2 斐波那契数

java 复制代码
int fib(int n){
    if(n<2)  return n;
	return   fib(n-1)+fib(n-2); 
}
  • 空间复杂度---> O(n)

4. 小结

以上就是对复杂度的了解,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持 !

相关推荐
sa100273 分钟前
基于Python的京东评论爬虫
开发语言·爬虫·python
foundbug9993 分钟前
STFT在图像配准中的MATLAB实现
开发语言·matlab
笙枫5 分钟前
基于AI Agent框架下的能源优化调度方案和实践 |工具函数介绍(详细)
java·人工智能·能源
我命由我123457 分钟前
Android Studio - Android Studio 去除 import 的未使用的类
android·java·ide·学习·java-ee·android studio·学习方法
Jeremy爱编码7 分钟前
leetcode热题组合总和
算法·leetcode·职场和发展
沛沛老爹11 分钟前
Skills高级设计模式(一):向导式工作流与模板生成
java·人工智能·设计模式·prompt·aigc·agent·web转型
ii_best12 分钟前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
程序员老徐12 分钟前
Tomcat源码分析二(Tomcat启动源码分析)
java·tomcat·firefox
BD_Marathon16 分钟前
SpringMVC——5种类型参数传递
android·java·数据库
努力学算法的蒟蒻17 分钟前
day57(1.8)——leetcode面试经典150
算法·leetcode·面试