第一讲 基本概念

1.1 什么是数据结构

  1. 图书摆放问题:

    1. 新书如何插入?

      先定类别,再二分查找

    2. 怎么找到指定某本书?

      二分查找

  2. 写程序实现一个函数PrintN

    1. 循环实现

      void PrintN(int N) {
      int i;
      for (i = 1; i <= N; i++) {
      printf("%d\n", i);
      }
      return;
      }
    2. 递归实现

      void PrintN(int N) {
      if (N) {
      PrintN(N - 1);
      printf("%d\n", N);
      }
      return;
      }
    3. 二者对比

      递归的程序对空间的占用有时候可能是非常恐怖的

      上述函数将所占用的空间都占用了还不够,所以就非正常中止。

      得出结论,解题的效率也与占用空间有关

  3. 写程序计算给定多项式在给定x处的值

    1. 硬算

      \[% MathType!MTEF!2!1!+-
      % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn
      % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr
      % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiFv0Je9sqqr
      % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs
      % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai
      % aabeqaamaabaabauaakeaacaWGMbWaaeWaaeaacaWG4baacaGLOaGa
      % ayzkaaGaeyypa0JaamyyamaaBaaaleaacaaIWaaabeaakiabgUcaRi
      % aadggadaWgaaWcbaGaaGymaaqabaGccaWG4bGaey4kaSIaaiOlaiaa
      % c6cacaGGUaGaey4kaSIaamyyamaaBaaaleaacaWGUbGaeyOeI0IaaG
      % ymaaqabaGccaWG4bWaaWbaaSqabeaacaWGUbGaeyOeI0IaaGymaaaa
      % kiabgUcaRiaadggadaWgaaWcbaGaamOBaaqabaGccaWG4bWaaWbaaS
      % qabeaacaWGUbaaaaaa!59BF!
      f\left( x \right) = {a_0} + {a_1}x + ... + {a_{n - 1}}{x^{n - 1}} + {a_n}{x^n}\
      \]
      double f(int n, double a[], double x) {
      int i;
      double p = a[0];
      for (i = 1; i <= n; i++) {
      p += (a[i] * pow(x, i));
      return p;
      }
      }
    2. 分配律

      \[% MathType!MTEF!2!1!+-
      % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn
      % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr
      % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiFv0Je9sqqr
      % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs
      % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai
      % aabeqaamaabaabauaakeaacaWGMbWaaeWaaeaacaWG4baacaGLOaGa
      % ayzkaaGaeyypa0JaamyyamaaBaaaleaacaaIWaaabeaakiabgUcaRi
      % aadIhadaqadaqaaiaadggadaWgaaWcbaGaaGymaaqabaGccqGHRaWk
      % caWG4bWaaeWaaeaacaGGUaGaaiOlaiaac6cadaqadaqaaiaadggada
      % WgaaWcbaGaamOBaiabgkHiTiaaigdaaeqaaOGaey4kaSIaamiEamaa
      % bmaabaGaamyyamaaBaaaleaacaWGUbaabeaaaOGaayjkaiaawMcaaa
      % GaayjkaiaawMcaaiaac6cacaGGUaGaaiOlaaGaayjkaiaawMcaaaGa
      % ayjkaiaawMcaaaaa!5D25!
      f\left( x \right) = {a_0} + x\left( {{a_1} + x\left( {...\left( {{a_{n - 1}} + x\left( {{a_n}} \right)} \right)...} \right)} \right)\
      \]
      double f(int n, double a[], double x) {
      int i;
      double p = a[n];
      for (i = n; i > 0; i--) {
      p = a[i - 1] + x * p;
      return p;
      }
      }
    3. 通过重复运算计算二者计算时长(Tick值),发现前者比后者慢了一个数量级

  4. 所以到底什么是数据结构

    1. 数据对象在计算机中的组织方式

      数据结构有逻辑结构和物理结构

    2. 数据对象必定与一定操作有关,这种操作即为算法

    3. 描述数据结构有个很好的方法“抽象数据类型(Abstract Data Type)”

      1. 数据类型

        1. 数据对象集
        2. 数据集合相关联的操作集
      2. 抽象:描述数据类型的方法不依赖于具体实现
        1. 与存放数据的机器无关
        2. 与数据存储的物理结构无关
        3. 与实现操作的算法和编程语言无关

1.2 什么是算法

  1. 算法(Algorithm)

    • 一个有限指令集
    • 接收一些输入(有些情况不需要输入)
    • 产生输出
    • 一定在有限步骤后终止
    • 每一条指令必须
      • 有充分明确的目标,不可以有歧义
      • 计算机能处理的范围之内
      • 描述应不依赖于任何一种计算机语言以及具体的实现手段
  2. 什么是好的算法?

    1. 空间复杂度S(n)

      占用存储单元的长度

      PrintN程序中,循环解法只需要占据固定空间,而递归解法占据N倍空间

    2. 时间复杂度T(n)

      耗费时间的长度

      多项式题目:

      ![image-20210420195835100](C:\Users\Mr. Chen\AppData\Roaming\Typora\typora-user-images\image-20210420195835100.png)

    考虑复杂度时,一般考虑的是最坏复杂度

    ![image-20210420200053961](C:\Users\Mr. Chen\AppData\Roaming\Typora\typora-user-images\image-20210420200053961.png)

    若有两段算法分别有复杂度T1(n)=O(f1(n))和T2(n)=O(f2(n)),则

    ​ T1(n)+T2(n)=max(O(f1(n)),O(f2(n)))

    ​ T1(n)*T2(n)=O(f1(n) * f2(n))

    若T(n)是关于n的k阶多项式,那么T(n)=theta(n^k)

    一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度

    if-else结构的复杂度取决于if的条件判断复杂度和分支部分的复杂度,总体复杂度取三者中最大

1.3 最大子列和问题

题目:

给定N个整数的序列{A1,A2,...,An},求函数

\[% MathType!MTEF!2!1!+-
% feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn
% hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr
% 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiFv0Je9sqqr
% pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs
% 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai
% aabeqaamaabaabauaakeaacaWGMbWaaeWaaeaacaWGPbGaaiilaiaa
% dQgaaiaawIcacaGLPaaacqGH9aqpciGGTbGaaiyyaiaacIhacaGG7b
% GaaGimaiaacYcadaaeWbqaaiaadgeadaWgaaWcbaGaam4Aaaqabaaa
% baGaam4Aaiabg2da9iaadMgaaeaacaWGQbaaniabggHiLdGccaGG9b
% aaaa!5389!
f\left( {i,j} \right) = \max \{ 0,\sum\limits_{k = i}^j {{A_k}} \} \
\]

的最大值。

算法1-暴力求解法

int MaxSubseqSum1(int A[], int N) {
int ThisSum, MaxSum = 0;
int i, j, k;
for (i = 0; i < N; i++) {
for (j = i; j < N; j++) { //遍历所有f(i,j)
ThisSum = 0;
for (k = i; k <= j; k++) //计算求和函数
ThisSum += A[k];
if (ThisSum > MaxSum) //MaxSum更新
MaxSum = ThisSum;
}
}
return MaxSum;
}

算法复杂度:O(N^3)

算法2-递加

int MaxSubseqSum1(int A[], int N) {
int ThisSum, MaxSum = 0;
int i, j, k;
for (i = 0; i < N; i++) {
ThisSum = 0;
for (j = i; j < N; j++) { //每次循环一次,就加一次,没必要每次都从头开始加
ThisSum += A[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}

算法复杂度:O(N^2)

算法3-分而治之

4 -3 5 -2 -1 2 6 2

4 5 2 6

​ 6 8

​ 11

算法复杂度:O(NlogN)

算法4-在线处理

int MaxSubseqSum1(int A[], int N) {
int ThisSum, MaxSum = 0;
int i;
ThisSum = MaxSum = 0;
for (i = 0; i < N; i++) {
ThisSum += A[i]; //向右累加
if (ThisSum > MaxSum) {
MaxSum = ThisSum; //发现更大和则更新当前结果
}
else if (ThisSum < 0) { //如果当前子列和为负数
ThisSum = 0; //则不可能使和后面的部分和增大,抛弃之(关键是此时MaxSum不变!)
}
}
return MaxSum;
}

算法复杂度:O(N)

浙大MOOC《数据结构》随笔的更多相关文章

  1. 数据结构-浙大 MOOC 笔记一 基本概念

    做一些笔记记录自己的学习过程 第一节课介绍了数据结构的基本概念,首先没有直接给出相关的定义而是通过思考如何在书架上摆放书籍这样一个简单的类比了解到数据的组织方式的重要性,并通过printN函数的循环实 ...

  2. 数据结构 浙大MOOC 笔记二 线性结构

    线性表及其表现 第二章的内容是关于三种最基本的数据结构 结合<DDSA>第三章 表.栈和队列做一个总结 首先简单说明一下各个数据结构的特点: 数组:连续存储,遍历快且方便,长度固定,缺点是 ...

  3. 数据结构入门第二课(浙大mooc)

    数据结构入门第二课 目录 数据结构入门第二课 引子 多项式的表示 方法1 顺序结构表示多项式各项 方法2 顺序结构表示非零项 方法3 链表结构存储非零项 多项式问题的启示 线性表 线性表的抽象数据类型 ...

  4. c++数据结构随笔(1)

    创建数据结构单链表的时候,突然碰到基础不牢固的问题,指针问题.就当复习指针了. 问题是如果三个指针a和b和r, b=a; b->next = r; 那么a->next会不会变? 然后写了一 ...

  5. 清华大学慕课 (mooc) 数据结构-邓俊辉-讲义-合并版

    邓公的数据结构一直好评如潮,可惜我如今才开始学习它.QAQ 昨天,<数据结构 (2020 春)>的讲义已经推到清华大学云盘上了.苦于 10 拼页的打印版不易在 PC 上阅读(手机上更是如此 ...

  6. 浙大《数据结构》学习&练习(一)算法初步

    1.数据结构是数据在计算机中的组织方式,类比图书在图书馆中的存储,应该如何分类,如何在书架上存取. 2.抽象数据结构是对一类的数据的一种组织方式的通用(抽象)描述,包括类型的名称,数据对象集和操作集. ...

  7. 数据结构随笔-php实现队列

    队列(Queue): 满足先进先出(FIFO)的规则: 下面使用php实现一个简单的循环队列模型: 初始状态的队列,队列长度为0,队头和队尾的指针相同均位于队列的开始: 入队操作:队尾指针向后移动,长 ...

  8. 数据结构随笔-php实现栈

    栈(Stack)满足后进先出(LIFO)的原则: 下面利用php实现栈的相关操作: 本实例栈的基本操作: 入栈(push):向栈内压入一个元素,栈顶指针指向栈顶元素 出栈(pop): 从栈顶去除元素, ...

  9. 抓取mooc中国随笔

    // $url = "http://www.baidu.com/"; $url= "https://www.icourse163.org/web/j/courseBean ...

随机推荐

  1. 消息中间件选型分析:从 Kafka 与 RabbitMQ 的对比看全局

    本文转载自消息中间件选型分析:从 Kafka 与 RabbitMQ 的对比看全局 前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布 ...

  2. idea没有错误提示的解决方法(一直处于错误分析中)

    仅作记录,以防再次发生却不记得. 原文链接:https://blog.csdn.net/a755199443/article/details/90084316 问题描述:idea没有自动报错.例如随便 ...

  3. 解决java POI导入Excel超时问题

    由于要导入大量数据,后台会耗费很长时间,导致超时. 本项目前端request.js中设定的超时时间为150s. const service = axios.create({ baseURL: base ...

  4. docker的安装和基本的docker命令、镜像和容器的操作

    1.yum 包更新到最新 yum update 2.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum insta ...

  5. PAT-1064(Complete Binary Search Tree)JAVA实现

    Complete Binary Search Tree PAT-1064 本次因为涉及到完全二叉排序树,所以可以使用数组的形式来存储二叉排序树 对输入序列排序后,得到的是中序遍历二叉排序树的序列.对这 ...

  6. [个人总结]pytorch中用checkpoint设置恢复,在恢复后的acc上升

    原因是因为checkpoint设置好的确是保存了相关字段.但是其中设置的train_dataset却已经走过了epoch轮,当你再继续训练时候,train_dataset是从第一个load_data开 ...

  7. .net 开源模板引擎jntemplate 教程:基础篇之语法

    一.基本概念 上一篇我们简单的介绍了jntemplate并写了一个hello world(如果没有看过的,点击查看),本文将继续介绍jntemplate的模板语法. 我们在讲解语法前,首先要了解一下标 ...

  8. Azure Front Door(一)为基于.net core 开发的Azure App Service 提供流量转发

    一,引言 之前我们讲解到使用 Azure Traffic Manager.Azure LoadBalancer.Azure Application Gateway,作为项目的负载均衡器来分发流量,转发 ...

  9. STM32F103VET6-keil工程配置-USART串口中断

    1.新建一个标准空白工程 2.设置时钟源为外部HSE时钟 1 #ifndef __SYSCLK_CONFIG_H 2 #define __SYSCLK_CONFIG_H 3 #include &quo ...

  10. WPF 应用 - 使用 Properties.Settings 保存客户端密码

    1. 先在项目的 Settings.settings 新建需要的字段和类型 有需要还可设置初始默认值 2. 启动客户端时,获取 Properties.Settings 的属性值 public void ...