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


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

    时间复杂度(流程决定)

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

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

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

    •常数时间的操作

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

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

    常见的常数时间的操作

    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!)

  • 相关阅读:
    Java 集合类
    Java 中的四种引用及垃圾回收策略
    Java 类的加载过程(阿里面试题)
    JMeter进行一次简单的压力测试
    python使用 HTMLTestRunner.py生成测试报告
    python读取配置文件
    python的IDE工具-- Pycharm
    selenium webdriver+python基本操作
    SQL开发测试使用基础
    python学习笔记
  • 原文地址:https://www.cnblogs.com/wangyang1991/p/15185751.html
Copyright © 2020-2023  润新知