评估算法优劣的核心指标是什么?

评估算法优劣的核心指标是什么?

时间复杂度(流程决定)

额外空间复杂度(流程决定)

常数项时间(实现细节决定)

什么是时间复杂度?时间复杂度怎么估算?

•常数时间的操作

•确定算法流程的总操作数量与样本数量之间的表达式关系

•只看表达式最高阶项的部分

常见的常数时间的操作

Misplaced &

总之,执行时间固定的操作都是常数时间的操作。

反之,执行时间不固定的操作,都不是常数时间的操作

选择排序

过程:

arr[0~N-1]范围上,找到最小值所在的位置,然后把最小值交换到0位置。

arr[1~N-1]范围上,找到最小值所在的位置,然后把最小值交换到1位置。

arr[2~N-1]范围上,找到最小值所在的位置,然后把最小值交换到2位置。

arr[N-1~N-1]范围上,找到最小值位置,然后把最小值交换到N-1位置。

估算:

很明显,如果arr长度为N,每一步常数操作的数量,如等差数列一般

所以,总的常数操作数量 = a(N^2) + bN + c (a、b、c都是常数)

所以选择排序的时间复杂度为O(N^2)。

冒泡排序

过程:

在arr[0~N-1]范围上:

arr[0]和arr[1],谁大谁来到1位置;arr[1]和arr[2],谁大谁来到2位置…arr[N-2]和arr[N-1],谁大谁来到N-1位置

在arr[0~N-2]范围上,重复上面的过程,但最后一步是arr[N-3]和arr[N-2],谁大谁来到N-2位置

在arr[0~N-3]范围上,重复上面的过程,但最后一步是arr[N-4]和arr[N-3],谁大谁来到N-3位置

最后在arr[0~1]范围上,重复上面的过程,但最后一步是arr[0]和arr[1],谁大谁来到1位置

估算:

很明显,如果arr长度为N,每一步常数操作的数量,依然如等差数列一般

所以,总的常数操作数量 = a(N^2) + bN + c (a、b、c都是常数)

所以冒泡排序的时间复杂度为O(N^2)。

插入排序

过程:

想让arr[0~0]上有序,这个范围只有一个数,当然是有序的。

想让arr[0~1]上有序,所以从arr[1]开始往前看,如果arr[1]<arr[0],就交换。否则什么也不做。

想让arr[0~i]上有序,所以从arr[i]开始往前看,arr[i]这个数不停向左移动,一直移动到左边的数字不再比自己大,停止移动。

最后一步,想让arr[0~N-1]上有序, arr[N-1]这个数不停向左移动,一直移动到左边的数字不再比自己大,停止移动。

估算时发现这个算法流程的复杂程度,会因为数据状况的不同而不同。

最差的情况时间复杂度为O(N^2)。

额外空间复杂度

实现一个算法流程,在实现算法流程的过程中,你需要开辟一些空间来支持你的算法流程。

作为输入参数的空间,不算额外空间。

作为输出结果的空间,也不算额外空间。

因为这些都是必要的、和现实目标有关的。所以都不算。

但除此之外,你的流程如果还需要开辟空间才能让你的流程继续下去。这部分空间就是额外空间。

常见的时间复杂度

排名从好到差:

O(1)

O(logN)

O(N)

O(N*logN)

O(N^2) O(N^3) … O(N^K)

O(2^N) O(3^N) … O(K^N)

O(N!)

posted @ 2021-08-25 16:42  习惯1991  阅读(319)  评论(0编辑  收藏  举报