# Lecture1 - 序言
本章考点:
- 数据结构的定义 - 了解(我们院一般不考
- 数据结构的分层 - 知道逻辑结构、物理结构(不会直接考
- 面向对象(OO)、ADT 一般不考
- 面向对象有别的科目考,数据结构不会专门考
- 算法的定义:an operation sequence of soluting a problem(考过一次
- Properties (性质):
- 1.Input specified
- 2.Output specified
- 3.Definiteness
- 4.Effectiveness
- 5.Finiteness
- Properties (性质):
- 程序和算法的相同点和不同点(问答题)
- 数学复习不会直接考
- 证明方法:不做重点
- 递归算法要掌握
- 重点掌握物理层
- 泛型不考(但是要会读程序
# 数据和数据结构
# 数据
- 数据是信息的载体,数据是数字、字符和其他符号的集合。
- 这些符号可以被输入计算机,并且被计算机程序识别和处理。
- 注:不能是无意义的符号
- 数据可以被用来描述客观对象。
- 数据分类:
- 数值型数据:int,float,complex (复数)…
- 非数值型数据:character,string,graph,voice
# 数据结构
- 定义:数据结构是描述数据对象和数据对象之间关系的统称。
- 数据结构分类:
- 线性结构
- 非线性结构
- 数据结构涉及三个方面:数据结构是分层的。
- 数据的逻辑结构 —— 从用户视图看,是面向问题的。
- 数据的物理结构 —— 从具体实现视图看,是面向计算机的。
- 相关的操作及其实现。
# ADT and OO
- ADT(Abstact data types)
- OO(object oriented)
# 数据类型
- 数据类型的本质在于操作。
- 数据按照二进制进行存储。
- 在内存中读取数据的时候,要注意大端形式。(高位在低地址)
- float 是最大约 3*1020,参照 IEEE754 标准
- 对于 64 位系统,字长 word 是 64Byte
- 数据类型分类
# ADT
- ADT 是将类型和与这个类型有关的操作集合封装在一起的数据模型。
将数据类型的使用和实现分开的编程方法
# OOP
- 面向对象编程是一种程序编写思想。
- AOP 是 OOP 的延续。
- 三个方面:(考研)
- 封装
- 继承
- 多态
- 为什么选择 OOP:
- 最重要的是要保证模块之间的关系越少越好 (耦合性低)。
- 真正从某种程度上来保证了软件可以做大。
- 面向对象的过程中:你的 private 部分可以进行修改,避免出现修改时候的影响,你的 public 部分不要随意修改。
# class 类
- objects of same attributes and operates. an instance is an object of the class. different object has different attribute value 一些属性和一些操作的对象。实例这个类的一个对象。不同的对象有着不同的类。
# inherit 继承
# 消息和通信
- 类之间传递消息。
# 算法
# 算法定义
为了解决某个问题的一系列操作。(an operation sequence of soluting a problem)
Properties (性质):
- 1.Input specified
- 2.Output specified
- 3.Definiteness
- 4.Effectiveness
- 5.Finiteness
(1) 输入:由外部提供的量作为算法的输入。
(2) 输出:算法产生至少一个量作为输出。
(3) 确定性:组成算法的每条指令是清晰,无歧义的。
(4) 有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
(5) 可行性:算法中所有的操作都必须足够基本,使算法的执行者或阅读者明确其含义以及如何执行。
- 程序:是可以用机器处理,并且能够理解程序语言。
# 程序和算法的相同点和不同点(问答题)
不同点
- 算法可由多种描述方法描述,程序由计算机语言编写
- 算法满足输入、输出、确定、有限、可行的特点,程序不满足有限的特点,如操作系统
联系
- 程序 = 算法 + 数据结构
- 算法是解决问题的步骤,程序是算法的代码实现。
- 一个算法可以用不同的编程语言编写出不同的程序。
# 数学知识回顾
- logA 不写底数的情况下,默认底数是 2
# 同余
- A≡B(mod N)
# 数学归纳法
- 格式:
- basis
- inductive (归纳的) hypothesis
- inductive proof
# 反证法
# 递归 (重要,重点掌握物理层)
- 递归:程序调用自己的编程技巧。函数和函数的调用可以构成一个环,就可以称作一个递归。
- 注意:
- 递归就是在过程或函数里面调用自身 (自递归)
- 使用递归,必须有一个明确的递归结束条件,称为递归出口。只有一个就行
- 两个或者多个函数互相递归 (互递归)
- 过程:
- 递归:把复杂的问题的求解推到比原问题更简单的问题的求解
- 回归:获得最简单的情况后,逐步返回,依次得到复杂的解。
- 例子:斐波那契数列,背包问题、汉诺塔问题。
int fib(int n){ | |
if(n>1) return fib(n-1) + fib(n-2); | |
else return n; //n = 0, 1 时给 recursion 终止条件 | |
} |
# exmaple1
# exmaple2
# example3
# example4-permutation
void perm(char* list, int k, int m){ | |
if(k == m){ | |
for(int i = 0; i <= m; i++){ | |
cout << list[i]; | |
} | |
cout << endl; | |
}else{ | |
for(int i = k; i <= m; i++){ | |
swap(list[k], list[i]); | |
perm(list, k+1, m); | |
swap(list[k], list[i]); | |
} | |
} | |
} | |
int main(){ | |
char list[] = "abc"; | |
perm(list, 0, 2); | |
return 0; | |
} |
交换 - 递归 - 复原
# example5-Hanoi tower
# 递归的分类
# Java 基础
会读泛型