普林斯顿公开课 算法1-5:算法理论

本节主要讲解的是算法的复杂度。

算法性能

算法的性能分为三种:

  • 最佳情况:计算时间最短的情况
  • 最差情况:计算时间最长的情况
  • 平均情况:随机输入的期望开销

以二分查找为例

最佳情况是1,因为第一次就有可能找到需要找的整数。

最差情况是logN

平均情况是logN

算法复杂度

算法复杂度用于定义问题的难度,另外也有助于开发最优化的算法,算法复杂度可以通过分析最坏情况来减少输入数据对算法性能的影响。

为了简化问题难度的表示方法,算法复杂度减少了算法分析的细节,忽略常数系数。

最优算法

所谓的最佳算法就是在任何情况下都能保证运行时间在理论范围内,而且没有更好的算法能够超越。

算法复杂度表示方法

常见的表示方法有比如O(N^2)表示算法最大可能的复杂度,Ω(N^2)表示最小可能的复杂度,Θ(N^2)表示算法复杂度的增长情况。

举例

问题描述:判断一个数组中有多少个0。

以暴力方法为例。

这个问题中性能上限就是指某个特定的算法能实现的复杂度。

算法下限就是经过数学方法的证明,最优算法的复杂度是Ω(N)。因为数组中每个元素都有可能是0,必须要循环整个数组才能得出结果。

最优算法:这个问题中暴力算法就是最优算法,所以最优算法的复杂度为Θ(N^2)。

算法的开发步骤

  1. 开发一个算法
  2. 证明最低下限

如果开发出的算法复杂度和证明得出的最低复杂度不相符的话,可以去寻找新的算法。也有可能是证明出错,当然证明出错的情况是比较少见的。

1970年代是算法设计的黄金年代。

误区

关于算法复杂度有以下误区:

  • 太在乎最坏情况。其实实际应用中最坏情况基本上不会出现。
  • 试图通过提高复杂度的常数系数来提高性能。
  • 将大O当成近似复杂度,其实真正的近似复杂度称之为波浪记法。

普林斯顿公开课 算法1-5:算法理论,布布扣,bubuko.com

时间: 2024-08-06 07:57:31

普林斯顿公开课 算法1-5:算法理论的相关文章

普林斯顿公开课 算法3-7:排序算法复杂度

算法复杂度用来表示在解决某个问题时,算法的性能表现. 复杂度上限,就是某个具体的已经实现的算法能够保证在一定时间内解决问题 复杂度下限,就是通过数学方法证明,所有的算法都必须花费一定的时间才能解决问题 最优化算法,就是可能达到的最小复杂度的算法,通常介于复杂度上限和下限之间 比如排序问题中: 计算模型为决策树 使用比较次数作为开销依据 复杂度上限:使用归并排序可以达到N lgN复杂度 复杂度下限:? 最优化算法:? 决策树举例 有三个不同的元素a b c,通过比较的方式来得出排序结果.那么它的决

普林斯顿公开课 算法1-10:并查集-优化的快速合并方法

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

普林斯顿公开课 算法1-11:并查集的应用

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

普林斯顿公开课 算法2-1:排序概述

目标 对所有类型的数据进行排序. 问题 排序函数如何知道比较的是哪种类型的数据呢? 回调函数 这时候就需要引入回调函数的概念了.回调函数就是将可执行的代码作为参数进行传递. 实现回调的方法 在Java中可以通过接口来实现,在C语言中可以通过函数指针来实现,C++中可以通过class-type functor,也就是重载操作符operator ()的类,在C#中可以使用Delegate委托,在Python/Perl/ML/javascript中可以直接传递函数. JDK中提供了Comparable

普林斯顿公开课 算法1-1:算法分析

为什么要分析算法 分析算法能够预測算法的性能,比較算法之间的优劣,保证算法的正确性,理解算法的理论基础. 成功算法的样例 离散傅立叶变换,假设使用暴力方法,那么算法的复杂度是是N^2,假设使用FFT高速傅立叶变换能够实现O(N logN)复杂度 N-body模拟:使用Barnes-hut算法能够将复杂度减少到N logN 顺便发一张N-body模拟的炫图 Barnes-Hut算法示意图 算法分析的步骤 观察问题的特征和想到得到的结果 依据观察结果提出如果 使用如果来预測可能发生的情况 检測预測结

普林斯顿公开课 算法1-2:观察

这章通过一个简单的例子,详细说明算法分析的步骤. 算法 问题 给定N个不同的整数,从中任意取出三个整数.请问有几种情况,使得取出的3个整数之和为0? 解法 可以使用暴力算法,代码如下: 1 2 3 4 5 6 7 8 9 for(int i=0;i<N;i++){     for(int j=0;j<N;j++){         for(int k=0;k<N;k++){             if(a[i]+b[i]+a[k]==0){                 count+

普林斯顿公开课:算法第0章,课程介绍

课程介绍 这门课程核心内容是算法和数据结构. 具体的算法和数据结构如下: 数据类型:堆栈.队列.背包.并查集.优先队列. 排序:快排.并排.堆排.基数排序 查找:BST.红黑BST.哈希表 图:BFS.DFS.Prim.Kruskai.Dijkstra 字符串:KMP.正则.TST.哈夫曼.LZW 高级:B树.后缀数组.最大流 为什么要学习算法 算法在各个领域中都有应用. 算法可以提高编程效率. 算法可以将现实生活中的物理公式转换成代码,算法可以模拟现实世界,然后发现世界的奥秘. 算法是很有趣的

普林斯顿公开课 算法1-3:数学模型

本节主要通过建立数学模型,来计算算法的运行时间. 公式 算法的运行时间=所有操作的开销乘以操作的次数之和 开销 下表展示了各种操作所需要的时间(单位:纳秒) 整数加法 2.1 整数乘法 2.4 整数除法 5.4 浮点加法 4.6 浮点乘法 4.2 浮点除法 13.5 sin 91.3 arctan 129.0 举例 问题 计算数据中0的个数 代码 1 2 3 4 int count = 0; for (int i= 0; i < N; i++)     if (a[i] == 0)       

普林斯顿公开课 算法1-6:内存

讲完了算法的运行时间,现在讲一下关于算法的内存占用率. 内存单位 在计算机中,内存是通过字节来表示的,一个字节表示8个位.1KB是2^10字节. 数据类型占用的内存 在32位系统中,一个指针占用4个字节.在64位系统中一个指针占用8个字节.本课程中使用64位机器,一个指针占用8字节. 基本数据类型 以下是Java中基本数据类型占用的内存 boolean 1字节 byte 1字节 char 2字节 int 4字节 float 4字节 long 8字节 double 8字节 Java数组 Java中