[MOOC笔记]第一章 绪论(数据结构)

1.  计算

学习DSA的目的是实现有效的和高效的计算,同时在资源消耗的方面做到足够的低廉

计算 = 信息处理:借助某些工具,遵照一定规则,以明确机械的形式进行。

计算模型 = 计算机 = 信息处理工具

算法:在特定的计算模型下,旨在解决特定问题的指令序列。

算法的要素:


输入


待处理的信息(问题)


输出


经处理的信息(答案)


正确性


的确可以解决指定的问题


确定性


任一算法都可以描述为一个由基本操作组成的序列


可行性


每一基本操作都可实现,且在常数时间内完成


有穷性


对于任何输入,经有穷次基本操作,都可以得到输出


……


……

好算法的要素:


正确


符合语法,能够编译、运行


健壮


能辨别不合法的输入并做适当处理,而不致非正常退出


可读


结构化 + 准确命名 + 注释


效率


速度尽可能快,存储空间尽可能少

2.  计算模型

算法分析的两个主要方面:

1. 正确性:算法功能是否与问题要求一致。

2. 成本:运行时间 + 所需存储时间。

如何度量成本?

1.特定算法应用于不同实例:

问题:同一问题等规模的不同实例,计算成本不尽相同,甚至有实质差别。

例如:在平面上的n个点中,找到所形成三角形面积最小的三个点。以蛮力算法为例,最坏情况下需枚举C(n,3)种情况,运气好时只需要1次。

结果:为了稳妥起见,在规模相同的所有实例中,只关注最坏(成本最高)者。

2.特定问题使用不同算法:

问题:实验统计是最直接的方法,但无法准确的反应算法的真正效率。

例如:不同的算法,可能更适应于不同规模的输入。

不同的算法,可能更适用于不同类型的输入。

同一算法,可能由不同的程序员、用不同的程序语言、经不同的编译器实现。

同一算法,可能实现并运行于不同的体系结构操作系统……

结果:为了给出客观的评判,需要抽象出一个理想的平台或模型。不再依赖于上述种种具体的因素,从而直接而准确地描述、测量并评价算法。

TM(TuringMachine)和RAM(Random AccessMachine)

TM模型和RAM模型是一般计算工具的简化抽象,使我们可以独立于具体的平台,对算法的效率做出可信的比较和评判。

在这些模型中,算法的运行时间 ∝ 算法需要执行的基本操作次数,T(n) = 算法为求解规模为n的问题,所需执行的基本操作次数。

3.  大O记号(big-O notation)

渐进分析:当问题规模足够大后,通过计算成本如何增长,可以得到这样一条曲线:

但是我们所关心的并不是这条曲线局部的、细微的、暂时的一些趋势,而是看它主要的、长远的变化趋势。

为此可以采用所谓的大O记号从形式上简化成本:

T(n) = O(f(n)) iff ? c> 0 ,当 n >> 2后, 有 T(n) < c * f(n)

与f(n)相比,T(n)更为简洁,但依然反映了前者增长的趋势。

渐进分析还有其他记号,比如大Ω记号:

T(n) = Ω(f(n)) iff ? c > 0
,当 n >> 2后, 有 T(n) > c * f(n)

大Θ记号:

T(n) = Θ(f(n)) iff ? c1 > c2 > 0
,当 n >> 2后, 有 c1 * f(n) > T(n)> c2 * f(n)

大Ω记号表示函数的渐进下界,大Θ记号表示函数的渐进确界

大O记号的两条性质:

(1)对于任意常数c > 0,有O(f(n))= O(c * f(n))

(2)对于任意常数a > b > 0,有O(na + nb) = O(na)

通过大O记号对算法进行度量,常见复杂度有:

复杂度增长速度对比:

4.  算法分析

两个主要任务= 正确性(不变性 x 单调性)+ 复杂度

C++等高级语言的基本指令,均等效于常数条RAM的基本指令。在渐进意义下二者大体相当。

复杂度分析的主要方法:

1.迭代:级数求和

2.递归:递归跟踪 + 递推方程

3.猜测 + 验证

级数复杂度:


算术级数


与末项平方同阶


幂方级数


比幂次高出一阶


几何级数


与末项同阶


收敛级数


O(1)


几何分布


O(1)


调和级数


Θ(logn)


对数级数


Θ(nlogn)

5.  迭代与递归

减而治之:为求解一个大规模的问题,可以将其划分为两个子问题:其中一个退化平凡,另外一个规模缩减。通过分别求出子问题的解得到原问题的解。

分而治之:为求解一个大规模的问题,可以将其划分为若干(通常两个)子问题,规模大体相当。通过分别求出子问题的解得到原问题的解。

注:第一次写笔记加上第一章基本上都是基础知识感觉好多都是直接搬的教材,希望后边能好点吧。本课为清华大学邓俊辉老师的数据结构课程,MOOC平台为学堂在线,开课时间是2014年的9月15日。如果感兴趣的同学可以去看看,个人觉得还是讲的相当好的。

时间: 2024-08-05 19:05:05

[MOOC笔记]第一章 绪论(数据结构)的相关文章

数据库系统概论学习笔记-第一章绪论

数据库系统概论-第一章绪论 写在前面:寒假来临,除却走亲戚和同学聚餐,王者荣耀等游戏上分花销一点时间之外,自认为要花一点时间学习数据库和Android,以此来为下学期和共建项目打下一丢丢的基础.为了鞭策自己,定了一个小目标( 一个亿),每个两至三天我会发表一篇数据库或Android学习笔记.还是那句话你的才华撑不住你的野心时,那就静下来学习吧 . 数据库系统概述 数据库常用的术语和基本概念 数据库基本概念 数据(Data) 数据是数据库中存储的基本对象,可以对数据做如下定义:描述事物的符号记录称

[MOOC笔记]第一章XA 动态规划(数据结构)

Fibonacci数列和动态规划 什么是Fibonacci数列? Fibonacci数列指的是这样一个数列 {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,144, ...} 它的第0项是0,第1项是第一个1.从第二项开始,每一项都等于前两项之和.用C语言可以表示为: //Fib(n) = Fib(n-1) + fib(n-2) int Fib(int n) { return(2 > n) ? n : Fib(n-1) + Fib(n-2); } 这段代码可以计

《信息系统项目管理师教程》读书笔记—第一章 绪论

1.1 什么是项目 1.1.1 项目的定义 项目(Project)是为提供某项独特的产品.服务或成果所进行的临时的一次性努力. 项目的特点: (1)临时性 (2)独特的产品.服务或成果 (3)渐进明细(Progressive Elaboration) 1.1.2 信息系统项目的特点 典型的信息系统项目有如下特点: 目标不明确 需求变化频繁 智力密集型 设计队伍庞大 设计人员高度专业化 涉及的承包商多 各级承包商分布在各地,相互关系复杂 系统集成项目中需研制开发大量的软硬件系统 项目生命期通常较短

《机器学习导论》学习笔记 第一章 绪论

必须先搞清楚机器学习中两个很重要的概念,一个是监督学习(Supervised Learning)和无监督学习(Unsupervised Learning). 这两者的区别就是前者知道了结果的正确值,后者没有这个指导值,也就是说你不知道所谓的正确结果. wikipedia上这样描述: 监督学习从给定的训练数据集中学习出一个函数,当新的数据到来时,可以根据这个函数预测结果.监督学习的训练集要求是包括输入和输出,也可以说是特征和目标.训练集中的目标是由人标注的. 无监督学习与监督学习相比,训练集没有人

【深入理解Linux内核】《第一章 绪论》笔记

1.商用Unix操作系统包括: - AT&T公司开发的(System V Release 4) SVR4. - 加州伯克利分校发布的4.4BSD - Dec公司(现属于HP)的Digital Unix - IBM公司的AIX - HP公司的HP-UX - Sun公司的Solaris   - Apple公司的Mac OS X 所有商业版本都是SVR4或4.4BSD的变体,并且都趋向于遵循某些通用标准:如IEEE的POSIX(Portable Operating Systems based on U

数据结构期末复习第一章绪论

前言: 最近快期末了,复习下数据结构,下列习题和答案解析,大部分来源于网络,如有不对之处还请指出. 在这里,星云祝各位考生期末考试顺利,新年快乐! 第一章绪论 1. 数据结构是一门研究非数值计算的程序设计问题中计算机的(操作对象)以及它们之间的(关系)和(操作)的学科. 2. 下列关于数据结构的基本概念中,叙述正确的是( C ). A. 数据元素是数据的最小单位. B. 数据的逻辑结构是指数据的各数据项之间的逻辑关系. C. 任何一个算法的设计取决于选定逻辑结构,而算法的实现依赖于采用的存储结构

【数据库原理】第一章 绪论

数据库原理 第一章   绪论 1.1   数据库系统概述 1.1.1      数据库的4个基本概念 1.数据 (1)数据是数据库中存储的基本对象 (2)数据:描述事物的符号记录,可以是数字.文字.图像等 (3)数据的含义称为数据的语意,数据与其语意密不可分 2.数据库 (1)数据库:长期储存在计算机内,有组织的.可共享的大量数据集合 (2)特点 <1>按照一定的数据模型组织.描述和存储 <2>具有较小的冗余度 <3>较高的数据独立性和易扩展性 <4>可为各

《Hadoop权威指南》笔记 第一章&第二章

? ? ? ? ? ? ? ? ? ? ? ? ? ? 使用MapReduce ? ? ? ? ? ? ? ? import java.io.IOException; // 是hadoop针对流处理优化的类型 import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; // 会继承这个基类 import org.apache

iOS 读书笔记 第一章

1.确定某个实例或类方法是否可用. 1)使用NSObject的类方法instancesRespondToSelector:来确定是否在该类的一个实例中存在一个特定的选择器. NSArray *array = @[@"1",@"2"]; if ([NSArray instancesRespondToSelector:@selector(sortUsingComparator:)]) { //do something use sortUsingComparator: }