邓俊辉 《数据结构》笔记1 绪论

news2025/2/3 22:55:00

邓俊辉 《数据结构》笔记1 绪论

CSDN转图床总是崩,如果全写完再上传一次要调好多,感觉很麻烦,所以写一点更新一点,会持续更新

提前发出来还有个好处就是push自己更新不会咕咕咕,哈哈

参考资料

  • MOOC 数据结构上
  • MOOC 数据结构下
  • 大佬笔记1
  • 大佬笔记2

文章目录

  • 邓俊辉 《数据结构》笔记1 绪论
  • 参考资料
  • A.计算
    • 一.引例
      • 绳索计算机
      • 尺规计算机
    • 二.算法
      • 算法的要素
      • 程序 ≠ 算法
        • 有穷性 引例:Hailstone
      • 什么是好算法
  • B.计算模型
    • 如何进行算法分析
      • 两个主要方面
      • 特定算法+不同实例(最坏情况)
      • 特定问题+不同算法
    • 图灵机
      • 图灵机模型
      • 图灵机实例
      • 图灵机演示
    • RAM
      • RAM模型
      • RAM实例
  • C.渐进复杂度
  • D.复杂度分析
  • E.迭代与递归
  • F.动态规划
  • XA.局限

A.计算

一.引例

呜呜呜邓老师的字好好看! 课件动画做的好🐮

绳索计算机

image-20221201211306446image-20221201211525631

算法:过直线上给定点作直角

perpendicular(l, P)
输入:直线l及其上一点P
输出:经过P且垂直于l的直线
1. 取12段等长绳索,依次首尾联结成环 //联结处称作“结”,按顺时针方向编号为0..11
2. 奴隶A看管0号结,将其固定于点P处
3. 奴隶B看管4号结,将绳索沿直线l方向尽可能地拉直
4. 奴隶C看管9号结,将绳索尽可能地拉直
5. 经过0号和9号结,绘制一条直线

以上由古埃及人发明、由奴隶与绳索组成的这套计算工具,乍看起来与现代的电子计算机相去甚远。

但就本质而言,二者之间的相似之处远多于差异,它们同样都是用于支持和实现计算过程的物理机制,亦即广义的计算机。因此就这一意义而言,将其称作“绳索计算机”毫不过分

尺规计算机

image-20221201211326608

算法:三等分给定线段

tripartition(AB)
输入:线段AB
输出:将AB三等分为两个点C和D
1. 从A发出一条与AB不重合的射线p
2. 任取p上三点C'、D'和B',使|AC'| = |C'D'| = |D'B'|
3. 联接B'B
4. 过D'做B'B的平行线,交AB于D
5. 过C'做B'B的平行线,交AB于C

这里面其实还有个子程序:过直线外一点,作平行线

二.算法

  • 计算 = 信息处理 = 借助某种工具,遵照一定规则,以明确而机械的形式进行

    工具如尺规、绳索 ; 规则如尺规的使用方法

  • 计算模型 = 计算机 = 信息处理工具

  • 所谓算法,即特定计算模型下,旨在解决特定问题的指令序列

算法的要素

  • 输入 待处理的信息(问题)

  • 输出 经处理的信息(答案)

    • 正确性 的确可以解决指定的问题

    • 确定性 可描述为一个由基本操作组成的序列 //加盐少许,加糖适量,煮至半熟…

      除了上面的尺规例子,欧氏几何给出了大量过程与功能更为复杂的几何作图算法,为将这些算法变成可行的实际操作序列, 欧氏几何使用了两种相互配合的基本工具:不带刻度的直尺,以及半径跨度不受限制的圆规。同样地,从计算的角度来看,由直尺和圆规构成的这一物理机制也不妨可以称作“尺规计算机”。 在尺规计算机中,可行的基本操作不外乎以下五类:

      1过两个点作一直线
      2确定两条直线的交点
      3以任一点为圆心,以任意半径作一个圆
      4确定任一直线和任一圆的交点(若二者的确相交)
      5确定两个圆的交点(若二者的确相交)
      

      每一欧氏作图算法均可分解为一系列上述操作的组合,故称之为基本操作恰如其分

    • 可行性 每一基本操作都可实现,且在常数时间内完成 //把大象放进冰箱,不过三步… (hhh大象放入冰箱一般情况下并不可行,所以这是个不可行的算法)

    • 有穷性 对于任何输入,经有穷次基本操作,都可以得到输出

    • and …

程序 ≠ 算法

有穷性 引例:Hailstone

H a i l s t o n e ( n ) = { { 1 } ( n ≤ 1 ) { n } ∪  Hailstone  ( n / 2 ) ( n  is even  ) { n } ∪  Hailstone  ( 3 n + 1 ) ( n  is odd  ) Hailstone (n)=\left\{\begin{array}{ll}\{1\} & (n \leq 1) \\ \{n\} \cup \text { Hailstone }(n / 2) & (n \text { is even }) \\ \{n\} \cup \text { Hailstone }(3 n+1) & (n \text { is odd })\end{array}\right. Hailstone(n)= {1}{n} Hailstone (n/2){n} Hailstone (3n+1)(n1)(n is even )(n is odd )

Hailstone(42)={ 42,21,64,32,…, 1 }


int hailstone(int n) {//计算序列Hailstone(n)的长度
	int length = 1;//从1开始,以下按定义逐步递推,并累计步数,直至n = 1
	while (1 <n) { (n % 2 ? n = 3 * n + 1 :n /= 2; length++; }
	return length;//返回 | Hailstone(n)|
}

上面这个程序看似很对,但是能称之为算法吗?

我们可以发现一些问题,比如n 与 length并不成正比

还有,它满足有穷性吗? 这个取决于hailstone序列本身

对于任意的 n ,总有 ∣ H a i l s t o n e ( n ) ∣ < ∞ 吗 ? \mid Hailstone (n) \mid<\infty \quad 吗 \quad ? Hailstone(n)∣<? 目前还木有结论,所以上面那个程序未必是一个算法

💭程序未必是算法

  • 配套的excel演示资源太帅啦!

    image-20221201220003072

什么是好算法

这一部分主要是树立观念

  • 符合语法,能够编译、链接

    • 能够正确处理简单的输入
    • 能够正确处理大规模的输入
    • 能够正确处理一般性的输入
    • 能够正确处理退化的输入
    • 能够正确处理任意合法的输入
  • 健壮: 能辨别不合法的输入并做适当处理 而不致非正常退出

  • 可读: 结构化 + 准确命名 + 注释 + …

  • 效率: 速度尽可能快 存储空间尽可能少 (most important!)

    hhh 既要马儿快快跑,又要马儿吃得少(

    • Algorithms + Data Structures = Programs
    • (Algorithms + Data Structures) x Efficiency = Computation

B.计算模型

如何进行算法分析

  • 有效性和高效性的前提是数据结构和算法两方面的有机结合,DSA(data structure and algorithm)

    • 定性:DSA的好坏取决于它的效率

    • 但实际应用中还需要度量,需要定量

      hhh 邓老师引用了好多名言

      To measure is to know.

      If you cannot measure it, you can not improve it. -Lord Kelvin

  • so,we need to 找到一个 统一尺度

两个主要方面

  • 正确:算法功能与问题要求一致? 需要数学证明

  • 成本:运行时间 + 所需存储空间 如何度量?如何比较?

    • 这里主要讨论成本 ,并主要先讨论时间成本
  • 若将计算成本描述为函数,如

    T A ( P ) T_A(P) TA(P)=算法A求解问题实例P的计算成本,但这样意义不大

    因为一个问题可能有很多实例,某个实例容易以偏概全

    所以要对实例粗略分类,划分等价类

  • 一般情况下(不绝对),问题实例的规模,往往是决定计算成本的主要因素

  • 通常:

    • 规模接近,计算成本也接近
    • 规模扩大,计算成本亦上升

特定算法+不同实例(最坏情况)

  • 在经过上面所说的等价类划分后,我们就可以重新将刚才那样一个数学的度量形式进行改写

    令: T A ( n ) T_A(n) TA(n) = 用算法A求解某一问题规模为n的实例,所需的计算成本

    • 和前面 T A ( P ) T_A(P) TA(P)最大的不同就在于把原来每一个具体的问题实例P,变成了笼统而言的一个规模的度量值,也就是n。也就是我们可以把某一个算法在求解规模为 n 的一大类实例的过程中,他们各自所需要的时间成本笼统计作 T A ( n ) T_A(n) TA(n)。我们如果暂时把算法固定,讨论特定算法A(及其对应的问题)时,也可以把 A 忽略掉,可简记作 T ( n ) T(n) T(n)
  • However,这样的定义依然不能满足我们实际的需求,不足以支撑我们分析的需要

    • Why?👇

    • 对于同一问题,即便是规模接近甚至相等的输入实力,计算成本虽然大体是差不多的,但是毕竟还是有差异,甚至会有实质性的差异。

    • 任给平面上n个点,在它们定义的 ( n 3 ) \left(\begin{array}{l}n \\ 3\end{array}\right) (n3) 个三角形中, 找出其中面积最小的三角形

      • 假设在平面中随便给定 n 个点(这里的 n 就是输入规模),我们知道其中的任何三个点都会定义一个三角形
      • 如果不知道技巧的话,不妨采用所谓的蛮力算法,也就是逐一的去枚举所有 n 中取 3 的组合,分别的算出它们各自对应的面积,并保留和记录下最后整体的最小值
      image-20221216212015065
    • 这个算法是正确的,但是我们这样固定的一个算法,对于不同的 n 个点的组合,有可能尝试的运气是不一样的,所需要的成本有很大的区别。

      • 比如在最坏的情况下,可能会直到把所有的组合都尝试变后,在最后才会找到最小的三角形
      • 但是反过来是欧皇的时候,可能第一次枚举的 3 个点就是共线的,面积为0,面积不可能是负值。这时已经找到了问题的解。
      • 所以我们可以看到同样规模为 n 的那些实例所需要的计算成本是有天壤之别。
        • Hailstone的例子,也是这样的一个情况。
  • 既然这样,那么我们又该如何去定义我们刚才所给出来的 T ( n ) T(n) T(n)

    • 显然,我们不能把命运寄托在最好的情况下,稳妥起见,应更关注一个算法的最坏情况。

    • 稳妥起见,取 $T(n)=\max {T§\big|\small| P \small|=n}\$

      • 亦即,在规模同为 n 的所有实例中,首先关注最坏(成本最高)者

特定问题+不同算法

在解决了特定算法的评价问题之后,我们就需要进一步的来回答另一个问题,也就是当同一个问题拥有多个算法的时候,这是经常出现的情况。我们如何来评价它们之间的相对好坏或者优劣?

  • 同一问题通常有多种算法,如何评判其优劣?

  • 实验统计是最直接的方法,但足以准确反映算法的真正效率?不足够!

    不同的算法各有所长,也各有所短。如果我们的测试在问题实例的规模以及类型等等方面覆盖的不够全面,不具有充分的代表性。这种测试本身就是带有偏见的,它的结论也难以让人信服

    • 不同的算法,可能更适应于不同规模的输入
    • 不同的算法,可能更适应于不同类型的输入

    即使是同一算法

    • 同一算法,可能由不同程序员、用不同程序语言、经不同编译器生成

      即便是由同一个程序员用同一种语言,并且用同一种编译器和设置编译出来的执行代码。在不同的硬件体系结构上,在不同操作系统上体现出来的性能,在此时和彼时也可能有很大的区别。比如硬件的 CPU 速度,内存的和磁盘的速度和容量,以及它们之间的带宽等等。包括操作系统在不同的时刻对不同计算资源分配的当时的状况不同等等。

    • 同一算法,可能实现并运行于不同的体系结构操作系统

    这些因素都不可能有限次实验统计就足以覆盖

  • 为给出客观的评判,需要抽象出一个理想的平台或模型

    我们需要抽象出一种理想的计算平台或者模型,为此才能抛开上述种种,具体的其实是次要的因素,更加直接和准确的来评价和测量算法。最后得出一个客观的结论

    • 不再依赖于上述种种具体的因素
    • 从而直接而准确地描述、测量并评价算法

    人们已经构造出了多种这样的理想的平台和模型。比如我们接下来要讨论的图灵机模型

图灵机

图灵机模型

图灵机实例

图灵机演示

RAM

RAM模型

RAM实例

C.渐进复杂度

D.复杂度分析

E.迭代与递归

F.动态规划

XA.局限

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机考研408】磁盘的初始化过程

该图是磁盘物理图 关于磁盘存储器&#xff0c;[柱面号盘面号扇区号]⇔外存块号 注&#xff1a;柱面是相对位置相同的磁道所构成的面 磁盘初始化 低级初始化&#xff08;也称物理格式化&#xff09; &#xff08;1&#xff09;分扇区 &#xff08;2&#xff09;用特殊数据结构…

linux后台自定义后台服务service(以filebeat举例)

文章目录一、配置攥写1&#xff09;安装filebeat和配置相关修改2&#xff09;常用命令二、启动顺序1&#xff09;命令循序2&#xff09;systemctl添加自定义系统服务&#xff08;服务填写指南&#xff09;3&#xff09;linux的systemctl命令详解及使用教程三、遇到的坑点和报错…

谁再要你自学网络安全,请给他一大B兜

前言 作为一名6年网安工程师老菜鸟来说&#xff0c;我实在想不通&#xff0c;开发岗位那么多&#xff0c;为什么要来学网安? 在这里必须给那些准备入坑的同学泼几盆冷水&#xff01;零基础自学网络安全&#xff1f;劝你还是别做梦了&#xff01; 基础确实很简单&#xff0c…

2023火爆共享购商业模式概念、框架、基础制度

各位企业家及创业者朋友们&#xff0c;你们好。我是微三云&#xff08;陈志坤&#xff09;&#xff0c;在你打开这个文章的时候&#xff0c;先不要急&#xff0c;因为任何一个能够长久、安稳、盈利的平台&#xff0c;背后肯定有一位看准宏观方向且耐心的人。这是一个极具颠覆性…

算法图论篇

文章目录一、DFS1.排列数字&#xff08;全排列&#xff09;2.n皇后3.树的重心二、BFS1.走迷宫2.八数码3.图中点的层次三、拓扑排序1.有向图的拓扑序列四、最短路1.Dijkstra2. bellman-ford3.spfa4.floyd五、求最小生成树1.Prim算法2.Kruskal算法六、二分图1.染色法判定二分图2.…

UWB汽车钥匙介绍

汽车钥匙经历了机械钥匙、遥控钥匙、PEPS、数字钥匙四个阶段&#xff0c;而数字钥匙又分为BLE/NFC/UWB三种技术路线。 由于UWB安全性、定位精度、作用范围明显好于BLE和NFC&#xff0c;因此成为汽车数字钥匙的最优技术。 PEPS与数字钥匙: PEPS是指无钥匙进入/无钥匙启动系统&a…

【爬虫】JS调试解决反爬问题系列2

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

ubuntu arm架构各版本源整理

目录 一、x86机构 1、ubuntu 20.04 2、ubuntu 18.04 3、ubuntu 21.10 4、ubuntu 22.04 二、arm机构 1、ubuntu 20.04 2、ubuntu 18.04 3、ubuntu 21.10 4、ubuntu 22.04 三、出现的问题 1、换成国内源后报https证书问题 2、如果选择国内开源站 ​3、提示the publi…

C语言重点解剖操作符要点速记

1.在多层嵌套的时候&#xff0c;每一次}结束加一个注释&#xff0c;标记清楚结束的是哪一个。 2.大部分注释都换成了空格。 in/* */t a; 等价于 in t a;替换成一个空格。 3.# define(中间可以有空格)&#xff0c;但是不建议。 4.全局变量&#xff0c;常量定义等建议加上注释…

基于昇思MindSpore Quantum,实现量子虚时演化算法

01、关于昇思MindSpore项目介绍 1.项目名称 基于昇思MindSpore Quantum&#xff0c;实现量子虚时演化算法 2.项目链接 https://summer-ospp.ac.cn/#/org/prodetail/221cb0176 3.项目描述 在本次项目中&#xff0c;我们将运用MindSpore Quantum框架在量子线路上完成虚时演…

【Django】第一课 银行账户管理系统开发

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架&#xff0c;采用的是MTV架构模式进行分层架构。 项目的搭建 1.打开pycharm开发软件&#xff0c;打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径&#xff0c;并使用创建djang…

算法刷题日志——dp

文章目录[打家劫舍 III](https://leetcode.cn/problems/house-robber-iii/description/)卖股票的最佳时机[买卖股票的最佳时机 II](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/)[买卖股票的最佳时机 III](https://leetcode.cn/problems/best-time-to-bu…

RK3588平台开发系列讲解(系统篇)A/B System的介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、简介二、配置2.1、uboot配置2.2、system bootctrl参考沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍RK3588平台的A/B System。 一、简介 A/B System指的是存在两套可以正常工作的系统,分别存…

项目实战!!! 在docker上部署Jenkins

需求&#xff1a;通过docker安装jenkins&#xff0c;并且通过Jenkins部署项目&#xff0c;最终效果是只要在jenkins对某个项目点击构建&#xff0c;jenkins就会去gitLab上拉取最新项目的最新代码&#xff0c;然后根据你自己项目的pom.xml文件&#xff0c;把项目打包成jar&#…

选择机器视觉传感器时要注意什么

在上篇文章中小编讲解了机器视觉传感器在测量中有哪些优势&#xff0c;看些看过文章的朋友有了个大概的了解&#xff0c;但是当我们在要使用机器视觉传感器时&#xff0c;一定要会正确的选择&#xff0c;这样才能保证产品在实际运用当中可以准确的检测出产品是否存在问题&#…

什么是框架?Java开发中常用的框架有哪些?

什么是框架 “框架&#xff08;Framework&#xff09;"一词最早出现在建筑领域&#xff0c;指的是在建造房屋前期构建的建筑骨架。在编程领域&#xff0c;框架就是应用程序的骨架&#xff0c;开发人员可以在这个骨架上加入自己的东西&#xff0c;搭建出符合自己需求的应用…

51单片机双轴太阳能追光追日系统ULN2003步进电机

实践制作DIY- GC0097-双轴太阳能追光追日系统 一、功能说明&#xff1a; 基于51单片机设计-双轴太阳能追光追日系统 功能介绍&#xff1a; STC15W48S4系列最小系统板2个ULN2003步进电机LCD1602显示器18650锂电池锂电池充电板4个光敏电阻太阳能充电 1.双轴XY追日&#xff0c…

这波无感升级有点秀——天翼云QEMU组件热升级方案来了

虚拟化技术作为云计算时代的核心技术&#xff0c;近年来应用越来越广泛。目前&#xff0c;大多数云厂商提供的云主机都是基于KVM/QEMU虚拟化技术实现的。而随着虚拟化技术的发展&#xff0c;QEMU组件也在不断引入新功能并进行功能优化和问题修复。 在公有云场景中&#xff0c;…

【解决方案】艾美捷脂肪生成测定试剂盒的功能和应用

肥胖在世界范围内日益受到关注&#xff0c;在美国已达到流行程度。1它是困扰我们社会的许多主要慢性疾病的危险因素&#xff0c;包括心血管疾病、糖尿病和癌症。近年来&#xff0c;许多研究集中于确定肥胖的发病机制&#xff0c;这是一个增加脂肪细胞数量&#xff08;脂肪细胞增…

游戏开发 dictionary 源码解析

Dictionary是我们经常使用的&#xff0c;一起来看看它是如何构造的&#xff0c;及有哪些优缺点。 Dictionary是一种键值对的形式存放数据&#xff0c;即 key值 、value 值 一 一映射的。key的类型没有限制&#xff0c;可以是整数、字符串甚至是实例对象。 Dictionary的实现原…