1.2 算法和算法评价(时间复杂度与空间复杂度)

1. 算法的基本概念

算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。

算法的特性:

1.有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
2.确定性:算法中每条指令必须有确定的含义,对于相同的输入只能得到相同的输出。
3.可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
4.输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。
5.输出:一个算法有一个多个输出,这些输出是与输入有着某种特定关系的量。

好的算法达到的目标:

正确性:算法应能够正确的求接问题。
可读性:算法应具有良好的可读性,以帮助人们理解。
健壮性:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名奇妙地输出结果。
效率与低存储量需求:效率是指算法执行的时间,存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。

2. 算法效率的度量

算法效率是通过时间复杂度和空间复杂度来描述的

2.1 算法的时间复杂度

时间复杂度是比较程序运行的时间么?

并不是,因为硬件的差异会导致时间的差异,一个很菜的程序在今天的电脑上运行的时间可能比一个优秀的程序在十年前的电脑运行的时间要短,所以没有比较时间不是很准确,那么我们通过语句执行的次数去比较就显得公平的多。

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(n)=O(f(n)),它表示随问题规模n的增大而增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。

例如:输入的参数为n,语句的次数为f(n),复杂度为O(f(n)),O()函数是去除高阶项系数与低阶项的函数

int count=0;

时间复杂度为O(0)

int n=8, count=0;

for (int i=1; i<=n; i++){
    
    
    count++;
}

时间复杂度为O(n)

2.2算法的空间复杂度

空间复杂度是考虑程序(可执行文件)的大小么?

空间复杂度是考虑程序运行时占用内存的大小,而不是可执行文件的大小。但也不是准确算出程序运行时所占用的内存,很有多因素会影响程序真正内存使用大小,例如编译器的内存对齐,编程语言容器的底层实现等等这些都会影响到程序内存的开销。所以空间复杂度是预先大体评估程序内存使用的大小。

算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它是问题规模n的函数。记为S(n)=O(g(n))。

int j = 0;
for (int i = 0; i < n; i++) {
    
    
    j++;
}

第一段代码我们可以看出,随着n的变化,所需开辟的内存空间并不会随着n的变化而变化
即此算法空间复杂度为一个常量,所以表示为大 O(1)

int* a = new int(n);
for (int i = 0; i < n; i++) {
    
    
    a[i] = i;
} 

我们new了一个数组出来,这个数据占用的大小为n
虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可
随着n的增大,开辟的内存大小呈线性增长,即 O(n)

猜你喜欢

转载自blog.csdn.net/m0_50991874/article/details/123292693