[数据结构 C++ (1) ]:第 1 章 绪论

博客围绕计算机与算法展开,介绍了冒泡排序及其时间复杂度,阐述算法应具备的要素。讲解复杂度度量,包括时间复杂度和渐进复杂度记号。分析复杂度函数的渐进增长情况,还探讨了线性递归和二分递归,如数组求和、斐波那契数列等应用。

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

第1章 绪论

1.1 计算机与算法

1.1.1 冒泡排序

时间复杂度,用大O记号:T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2)

void bubblesort1A(){
	bool sorted = false;
	while(!sorted){
		sorted = true;
		for (int i = 1; i < n; i++){
			if (A[i-1] > A[i]){
				swap(A[i - 1],A[i]);
				sorted = false;
			}
		}
		n--;
	}
}
1.1.2 算法

算法是指基于特定的计算模型,旨在解决某一信息处理问题而设计的一个指令序列。算法应该具备:输入与输出,基本操作、确定性与可行性,难解性,计算效率,数据结构。

1.2 复杂度度量

时间复杂度 T(n)T(n)T(n),选用所有可能中执行时间最长者。
渐进复杂度:大OOO记号,大Ω\OmegaΩ记号,大Θ\ThetaΘ记号,表示时,常数项和低次项可以省略。
渐进复杂度记号

1.3复杂度分析

下列复杂度函数渐进增长。
O(log⁡(n))、O(n)、O(n)、O(nlog⁡(n))、O(n2)、O(n3)、O(2n)O(\log(n))、O(\sqrt{n})、O(n)、O(n\log(n))、O(n^2)、O(n^3)、O(2^n)O(log(n))O(n)O(n)O(nlog(n))O(n2)O(n3)O(2n)

1.4 递归

1.4.1 线性递归

数组求和,效果不好,蛮力递归

int sum(int A[], int n){
	if (1 > n){
		return 0;
	}
	else
		return sum(A,n-1) + A[n - 1];
}

数组交换

void reverse(int* A, int lo, int hi){
	if (lo < hi){
		swap(A[lo],A[li]);
		reverse(A, lo + 1,hi - 1);
	}
}
//用while可以替代递归
void reverse(int* A, int lo, int hi){
	while (lo < hi)	
		swap(A[lo++],A[hi--])
}

2n2^n2n可以体现算法的优化。
power2(nk)={ power 2(nk−1)∧2×2(bk=1) power 2(nk−1)∧2(bk=1) power2\left(n_{k}\right)=\left\{\begin{array}{l}{\text { power } 2\left(n_{k-1}\right)^{\wedge} 2 \times 2}\quad(b_k = 1)\\ {\text { power } 2\left(n_{k-1}\right)^{\wedge} 2} \quad \quad (b_k = 1) \end{array}\right. power2(nk)={ power 2(nk1)2×2(bk=1) power 2(nk1)2(bk=1)
正常情况下

//O(n)
int power2(n){
	if (n == 0)
		return 1;
	else 
		return power2(n-1)*2;
}
//O(r)  O(log n)
inline int  sqr(a){return a * a}
int power2(int n){
	if (0 == n) return 1;
	return (n & 1) ? sqr(power2(n >> 1)) <<1 : sqr(power2(n >> 1));
}
1.4.2 二分递归

数组求和可以将原来数组一分为二

int sum(int A[], int lo, int hi){
	if (lo == hi)
		return A[lo];
	else{
		int mi = (lo + hi) >> 1;
		return sum(A, lo, mi) + sum(A, mi + 1, hi);
	}
}
//O(logn)

斐波那契数列
见https://blog.youkuaiyun.com/shinef/article/details/93620991

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值