算法基础1:复杂度和简单算法

03-01 1426阅读

目录

一.时间复杂度

1.概述

2.时间复杂度表达

3.简便计算时间复杂度

4.注意事项

二.简单算法

1.异或运算

(1)交换操作

(2)异或算法应用1

(3)异或算法应用2

2.插入排序

3.二分法

4.对数器

三.空间复杂度

1.概念

2.空间复杂度计算和表示

(1)计算步骤:

(2)空间复杂度的表示

3.示例代码

(1)空间复杂度O(1)

(2)空间复杂度O(n)


一.时间复杂度

1.概述

        一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。

        时间复杂度为一个算法流程中,常数操作数量的一个指标。常用0(读作big 0)来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果为f(N),那么时间复杂度为0(f(N))。

       时间复杂度表示某个算法运行时间的趋势,可以大致评判程序的效率。 评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。

2.时间复杂度表达

        列出需要执行程序的次数,写成T(N)=aN²+bN+C的形式。此时,以存在的最高次项作为时间复杂度,因为N趋于无穷时,只有最高次项对结果的影响大。

例如:列出式子为aN³+bN+C,时间复杂度即为O(N³)。

具体的高阶低阶排行如下图:

算法基础1:复杂度和简单算法

  如果阶数指标相同,无法通过常数项比较时间复杂度,只能通过实际跑代码区分。

3.简便计算时间复杂度

        一般来说,最内层执行次数最多的语句就决定了整个算法的趋势,通常看最内层语句执行次数的规律即可。

4.注意事项

对于任何算法流程,估计时间复杂度O时,按照最差情况估计。

二.简单算法

1.异或运算

(1)交换操作

此时a和b必须拥有不相同的内存空间,因为同样的内存区域跟自己异或,会直接变成0。

void swap(int,a, int b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

(2)异或算法应用1

问题:一个数组中,只有1个数出现奇数次,其他数均出现偶数次。求出现奇数次的这个数。

解法:定义一个eor = 0,将数组中所有数与其异或,异或出的eor即为解。因为异或运算同一批数,不管顺序如何,异或结果一样。所以等同于偶数次的数先异或。

原理:异或的交换律。

#include
#include
#include
using namespace std;
void solve(int num[]);
int main() {
	//算法问题1:问题:一个数组中,只有1个数出现奇数次,其他数均出现偶数次。求出现奇数次的这个数
	//解法:定义一个eor = 0,将数组中所有数与其异或,异或出的eor即为解。
	int nums[] = { 1,2,1,2,1,3,2,1,2,3,3 };
	solve(nums);
	system("pause");
	return 0;
}
void solve(int num[]) {
	int eor = 0;
	int len = sizeof(num) / sizeof(num[0]);
	for (int i = 0; i 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]