算法-时间复杂度

本文介绍了算法设计与问题求解的过程,重点讲解了算法的时间复杂度。内容涵盖问题的定义、问题实例、算法的五个特性,以及如何分析非递归和递归算法的时间复杂度。举例说明了寻找最大元素和冒泡排序的时间复杂度,揭示了算法效率的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**
(这个就先放着吧)
在这里插入图片描述

算法设计于问题求解

-------------编程实践
**
第一章 问题求解概述

问题:是人们需要回答的一般性提问,通常包含若干个参数,由问题描述,输入条件,输出要求等要素组成。
问题实例:定义为确定问题描述参数后的一个对象。



正整数求和问题
问题描述:计算整数a和整数b的和c
输入条件:正整数a,b
输出要求:c


算法正确是指对于问题界定后的所有问题实例,算法执行后都能得到正确的结果。
问题求解周期:问题简化,模型构建,算法设计,程序设计与调试等过程。
问题简化得到的原型一般为问题描述-输入-输出。
算法:算法是任何定义好了的计算程式,它取某些值或值的集合作为输入,并产生某些值或值的集合作为输出。
(5个特性)
确定性,可实践性,有穷性,具体数据输入,具体数据输出。
可以没有输入但是一定要有输出(重点)
算法复杂性:分为时间复杂性和空间复杂性
算法执行所需要的空间包括指令空间,数据空间,系统栈空间三大类。
指令空间对于所解决的特定问题不够敏感,以至于可以忽略不记。
算法的效率:当要比较两个渐进复杂度的阶不同时,只要确定各自的阶,就可以判定哪个算法的效率高。
渐进符号O
符号O是为了简化算法复杂度分析而采用的一种记号。
非递归算法的复杂性分析
(1)确定关键操作
(2)计算关键操作的执行步数T(n)
(3)求解T(n)渐进阶,并用O记号表示


例:
寻找最大元素

int Max(int a[],int n){//寻找a[0:n-1]中最大的元素
	int pos = 0;
	for(int i=1;i<n;i++)
		if(a[pos]<a[i])
			pos=i;
			return pos;
	}

for循化中共进行了n-1次比较,所以时间复杂度为O(n)



冒泡排序

BubbleSort(int a[],int n){
	int t=0;//作为中间变量
	for(int i=n;i>1;i--)
		for(int j=0;j<i-1;j++){
			if(a[j]>a[j+1]){
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
				}
			}
		}

冒泡排序的时间复杂度为O(n^2)

递归算法的复杂性分析
三个步骤:
(1)分析递归程序的结构,确定每一逻辑块的时间复杂度。非递归的程序块用非递归方法分析其复杂度。
(2)构造复杂性函数的递归方程
(3)求解递归方程和渐进阶,并用O记号表示

int Hanoi(int n,int a,int b,int c){
	if(n<=0)return 0;
	Hanoi(n-1,a,c,b);
	Move(n,a,c);
	Hanoi(n-1,b,a,c);
	return 1;
	}

算法包括两次Hanoi递归调用,每一次调用的规模为n-1,假设原Hanoi算法执行的时间为T(n),每次递归调用的时间为T(n-1),递归方程为T(n)=2T(n-1)+c;c为Move的常数时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止境****

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值