第一讲 基本概念

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. elasticsearch如何设计索引

    本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 最近在做es相关的工作,所以记录下自己的一些想法,可能很多方面不会很全面,但是基本都是经过 ...

  2. django学习-10.django连接mysql数据库和创建数据表

    1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...

  3. C++算法代码——Sumsets[uva10125]

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1278 题目描述 给你一个整数的集合S(里面所有的整数均不相同),请你找出最大的 d, ...

  4. Mybites逆向工程的搭建

    这个链接写的很全:https://www.cnblogs.com/whgk/p/7140638.html 这段时间太忙,等周末写上自己尝试的步骤.暂时仅作记录.

  5. Django Admin 在内联中覆盖保存方法(admin.TabularInline)

    一  使用环境 开发系统: windows IDE: pycharm 数据库: msyql,navicat 编程语言: python3.7  (Windows x86-64 executable in ...

  6. eclipse安装mybatis的插件

    在help中打开Eclipse Marketplace... 输入mybatis后搜索,点击install即可 功能说明: 1.查找某一个方法 在dao接口中 按住Ctrl键,鼠标指到方法名称上 选择 ...

  7. Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例

    在<Kubernetes中分布式存储Rook-Ceph部署快速演练>文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernete ...

  8. C++ Primer Plus 第一章 预备知识

    C++ Primer Plus 第一章 预备知识 知识点梳理 本章主要讲述了C++的由来,讨论了面向过程语言与面向对象语言的区别,介绍了ANSI/ISO制定的C++标准,阐述了在Windows.Mac ...

  9. AndroidStudio 中 gradle.properties 的中文值获取乱码问题

    0x01 现象 在gradle.properties中定义了全局变量,然后从 build.gradle 中设置 app_name: resValue "string", " ...

  10. 鸿蒙开源第三方件组件——轮播组件Banner

    目录: 1.功能展示 2.Sample解析 3.Library解析 4.<鸿蒙开源第三方组件>系列文章合集 前言 基于安卓平台的轮播组件Banner(https://github.com/ ...