【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. 小结

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

相关推荐
SoraLuna9 分钟前
「Mac玩转仓颉内测版26」基础篇6 - 字符类型详解
开发语言·算法·macos·cangjie
出逃日志34 分钟前
JS的DOM操作和事件监听综合练习 (具备三种功能的轮播图案例)
开发语言·前端·javascript
前端青山1 小时前
React事件处理机制详解
开发语言·前端·javascript·react.js
雨中rain1 小时前
贪心算法(2)
算法·贪心算法
耀耀_很无聊2 小时前
第1章 初识SpringMVC
java·spring·mvc
麻衣带我去上学2 小时前
Spring源码学习(一):Spring初始化入口
java·学习·spring
东阳马生架构2 小时前
MySQL底层概述—1.InnoDB内存结构
java·数据库·mysql
black0moonlight2 小时前
ISAAC Gym 7. 使用箭头进行数据可视化
开发语言·python
maknul2 小时前
【学习笔记】AD智能PDF导出(装配文件)
笔记·学习·pdf
时光の尘3 小时前
C语言菜鸟入门·关键字·int的用法
c语言·开发语言·数据结构·c++·单片机·链表·c