# Lecture1 - 序言

本章考点:

  • 数据结构的定义 - 了解(我们院一般不考
  • 数据结构的分层 - 知道逻辑结构、物理结构(不会直接考
  • 面向对象(OO)、ADT 一般不考
  • 面向对象有别的科目考,数据结构不会专门考
  • 算法的定义:an operation sequence of soluting a problem(考过一次
    • Properties (性质):
      • 1.Input specified
      • 2.Output specified
      • 3.Definiteness
      • 4.Effectiveness
      • 5.Finiteness
  • 程序和算法的相同点和不同点(问答题)
  • 数学复习不会直接考
  • 证明方法:不做重点
  • 递归算法要掌握
    • 重点掌握物理层
  • 泛型不考(但是要会读程序

# 数据和数据结构

# 数据

  1. 数据是信息的载体,数据是数字、字符和其他符号的集合。
    • 这些符号可以被输入计算机,并且被计算机程序识别和处理。
    • 注:不能是无意义的符号
  2. 数据可以被用来描述客观对象。

image-20230207121841991

  1. 数据分类:
    1. 数值型数据:int,float,complex (复数)…
    2. 非数值型数据:character,string,graph,voice

image-20230207121856930

# 数据结构

  1. 定义:数据结构是描述数据对象和数据对象之间关系的统称。

img

  1. 数据结构分类:
    1. 线性结构
    2. 非线性结构

image-20230207122012856

  1. 数据结构涉及三个方面:数据结构是分层的。
    1. 数据的逻辑结构 —— 从用户视图看,是面向问题的。
    2. 数据的物理结构 —— 从具体实现视图看,是面向计算机的。
    3. 相关的操作及其实现。

image-20230207122025219

# ADT and OO

  1. ADT(Abstact data types)
  2. OO(object oriented)

# 数据类型

  1. 数据类型的本质在于操作。
  2. 数据按照二进制进行存储。
    • 在内存中读取数据的时候,要注意大端形式。(高位在低地址)
    • float 是最大约 3*1020,参照 IEEE754 标准

img

  1. 对于 64 位系统,字长 word 是 64Byte
  2. 数据类型分类

image-20230207122405013

# ADT

  1. ADT 是将类型和与这个类型有关的操作集合封装在一起的数据模型

image-20230207122446500

image-20230207122558040

将数据类型的使用和实现分开的编程方法

# OOP

  1. 面向对象编程是一种程序编写思想。
  2. AOP 是 OOP 的延续。
  3. 三个方面:(考研)
    1. 封装
    2. 继承
    3. 多态
  4. 为什么选择 OOP:
    1. 最重要的是要保证模块之间的关系越少越好 (耦合性低)。
    2. 真正从某种程度上来保证了软件可以做大。
  5. 面向对象的过程中:你的 private 部分可以进行修改,避免出现修改时候的影响,你的 public 部分不要随意修改。

# class 类

  1. objects of same attributes and operates. an instance is an object of the class. different object has different attribute value 一些属性和一些操作的对象。实例这个类的一个对象。不同的对象有着不同的类。

# inherit 继承

img

# 消息和通信

  1. 类之间传递消息。

# 算法

# 算法定义

  1. 为了解决某个问题的一系列操作。(an operation sequence of soluting a problem)

  2. Properties (性质):

    • 1.Input specified
    • 2.Output specified
    • 3.Definiteness
    • 4.Effectiveness
    • 5.Finiteness

    (1) 输入:由外部提供的量作为算法的输入。
    (2) 输出:算法产生至少一个量作为输出。
    (3) 确定性:组成算法的每条指令是清晰,无歧义的。
    (4) 有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
    (5) 可行性:算法中所有的操作都必须足够基本,使算法的执行者或阅读者明确其含义以及如何执行。

image-20230207122915617

  1. 程序:是可以用机器处理,并且能够理解程序语言。

# 程序和算法的相同点和不同点(问答题)

img

不同点

  1. 算法可由多种描述方法描述,程序由计算机语言编写
  2. 算法满足输入、输出、确定、有限、可行的特点,程序不满足有限的特点,如操作系统

联系

  1. 程序 = 算法 + 数据结构
  2. 算法是解决问题的步骤,程序是算法的代码实现。
  3. 一个算法可以用不同的编程语言编写出不同的程序。

# 数学知识回顾

  1. logA 不写底数的情况下,默认底数是 2

# 同余

  1. A≡B(mod N)

img

# 数学归纳法

img

img

  1. 格式:
    1. basis
    2. inductive (归纳的) hypothesis
    3. inductive proof

# 反证法

# 递归 (重要,重点掌握物理层)

  1. 递归:程序调用自己的编程技巧。函数和函数的调用可以构成一个环,就可以称作一个递归。
  2. 注意:
    1. 递归就是在过程或函数里面调用自身 (自递归)
    2. 使用递归,必须有一个明确的递归结束条件,称为递归出口。只有一个就行
    3. 两个或者多个函数互相递归 (互递归)
  3. 过程:
    1. 递归:把复杂的问题的求解推到比原问题更简单的问题的求解
    2. 回归:获得最简单的情况后,逐步返回,依次得到复杂的解。
  4. 例子:斐波那契数列,背包问题、汉诺塔问题。
int fib(int n){  
    if(n>1) return fib(n-1) + fib(n-2);  
    else return n; //n = 0, 1 时给 recursion 终止条件 
}

# exmaple1

image-20230207123943508

image-20230207124007738

# exmaple2

image-20230207124024647

image-20230207124035029

# example3

image-20230207124057849

image-20230207124110715

# example4-permutation

image-20230207124324364

image-20230207124440679

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

image-20230207124803866

image-20230207124810111

image-20230207131318680

# 递归的分类

# Java 基础

会读泛型