第一讲 基本概念

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. pytorch中修改后的模型如何加载预训练模型

    问题描述 简单来说,比如你要加载一个vgg16模型,但是你自己需要的网络结构并不是原本的vgg16网络,可能你删掉某些层,可能你改掉某些层,这时你去加载预训练模型,就会报错,错误原因就是你的模型和原本 ...

  2. MySQL全面瓦解23:MySQL索引实现和使用

    MySQL索引实现 上一篇我们详细了解了B+树的实现原理(传送门).我们知道,MySQL内部索引是由不同的引擎实现的,主要包含InnoDB和MyISAM这两种,并且这两种引擎中的索引都是使用b+树的结 ...

  3. Linux系列 -- XShell破解版安装教程

    目录 一.xshell6商业版安装教程 1. 为什么要用xshell 2. 打开Keygen软件获取注册码 3.安装Xmanager_PowerSuite软件 4.打开康康. 二.XShell远程连接 ...

  4. JAVA基础(三)—— 输入输出处理

    JAVA基础(三)-- 输入输出处理 1 输入解析 //Scanner获取输入 import java.util.Scanner; Scanner s = new Scanner(System.in) ...

  5. CentOS7 下Docker最新入门教程 超级详细 (安装以及简单的使用)

    转载https://blog.csdn.net/wzsy_ll/article/details/82866627 1.为什么使用Docker(本人) 最近总是频繁的在新服务器发布项目, 每次发布都需要 ...

  6. 你们一般都是怎么进行SQL调优的?MySQL在执行时是如何选择索引的?

    前言 过年回来的第二周了,终于有时间继续总结知识了.这次来看一下SQL调优的知识,这类问题基本上面试的时候都会被问到,无论你的岗位是后端,运维,测试等等. 像本文标题中的两个问题,就是我在实际面试过程 ...

  7. 基于Hi3559AV100 RFCN实现细节解析-(1)VGS初介绍

    下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,因为RFCN用到了VGS加框,因此本篇随笔将给出VGS视频图像子系统的具体说明,便于后面RFCN的细节实现说明. VGS 是视频图形子 ...

  8. PAT-1140(Look-and-say Sequence)字符串处理

    Look-and-say Sequence PAT-1140 #include<iostream> #include<cstring> #include<string&g ...

  9. HDOJ-6656(数论+逆元)

    Kejin Player HDOJ-6656 设f[i]为从i升级到i+1期望需要的金钱,由于每级都是能倒退或者升级到i+1,所以询问从l,r的期望金钱可以直接前缀和,那么推导每一级升级需要的期望钱也 ...

  10. 如何快速开发Winform应用系统

    在实际的业务中,往往还有很多需要使用Winform来开发应用系统的,如一些HIS.MIS.MES等系统,由于Winform开发出来的系统界面友好,响应快速,开发效率高等各方面原因,还有一些原因是独立的 ...