出自网络公开课 https://www.bilibili.com/video/av22774520?from=search&seid=10695542251210958364 的课堂笔记
课程1-24
算法是什么?
根据问题,借助工具,有一套固定的程序步骤来解决问题。
算法的有穷性?
一个看着正确的程序不一定是算法。需要考虑程序是否会陷入死循环。
什么样的算法才是好算法?
正确;健壮;可读;效率(最后两条尤其是最后一条最重要,既要马儿跑,又要马儿吃得少)
Algorithms + Data Structures = Programs
Programs X Efficiency = Computation
计算模型可分为什么?
数据结构+算法
度量的重要性:To mesure is to know. If you can not measure it, you can not improve it. -Lord Kelvin
算法分析的两个方面?
正确性:算法功能与问题要求是否一致
成本:运行时间+所需存储空间
对于成本,该如何度量呢?
我们可以用算法求解一个实例的计算成本,可是实例太多,光计算一个没有意义。所以我们需要归纳概括。
问题实例的规模,往往是决定计算成本的主要因素。
但是就算是同一问题等规模的不同实例,计算成本也不尽相同,甚至了实质差别。
为稳妥起见,我们会关注实例所需成本最高者。
对于不同的算法,如何评判优劣呢?
实验统计是最直接的方法,但不足以真正反映算法的真正效率。
为给出客观的评判,需抽象出一个理想的平台或模型,直接准确地评判优劣。
大O记号的特点:
好读书不求甚解。每有会意,便欣然忘食。
关注的是长远和主流。
O(1)
常数复杂度
O(logn)
对数复杂度
多项式复杂度
算法分析
级数
循环与级数
在有些情况下,不论问题规模多大,也可以是常数复杂度。
起泡排序
通过论证不变性和单调性推出正确性
基本的时间概念(封底估算)
在三生三世中的一秒,相当于在一天中的一秒
一个封底估算的实例
分而治之的思想
数组求和
一般认为空间复杂度为除了输入以外,为了求解而所需要的空间。这里有两个,即sum 和 i
这个算法不难,但是我们注意到它的思想是,每经过一次迭代,它的规模减小一些,下面引出一种减而治之的思想。
减而治之 decrease and conquer