个人博客
https://blog.hylstudio.cn/archives/951

20220520数据结构绿皮书读书笔记
TMD都520了,我却只能在这里读书

4.1 指针和链式结构

用数组迟早会溢出,所以有一种内存结构是指针,每次只申请一小块,记录下一个内存的地址,串起来
contiguous list 和linked list英文上统称是list,不知道咋翻译
中文第一个可以叫线性表,第二个叫做链表。区别就是一个内存上连续,一个不连续。但统称一般也被翻译为线性表,就混淆了

动态内存申请,C/C++支持使用new和delete进行动态内存申请和释放

基础结构

class Node<T> {T value;Node next;
}

4.2 链栈

细节略掉
实现时候注意next的修改顺序即可

4.3 安全措施

防止客户端内存泄漏,对于没有垃圾回收的语言,一旦内存动态申请忘了释放,时间长了就会出现内存泄漏

析构函数可以解决这个问题,当类的实例超出定义域时,会自动调用析构函数。这里记得清理动态申请的内存

运算符重载,C++特性,我们可以重载赋值操作的含义,正常的赋值操作是指针地址的拷贝。但自定义类中我们可以定义不同类的对象和我们定义的类做运算时具体的行为,允许覆盖已有的操作符来简化写法。但这个也是个大坑,运算符里可能包含了非预期行为,需要看源码才能知道

当复制一个对象的时候调用拷贝构造函数,完整复制一个对象的实例
这里需要知道深浅拷贝的概念,如果一个对象里包含另一个对象,浅拷贝就是单纯的每个字段都复制过去,但对象不复制。深拷贝就是把对象递归的做浅拷贝,递归到最后都是基本类型。拷贝的深度由各个类实现的拷贝构造函数自行决定

4.4 链式队列

细节略掉
实现时候注意next的修改顺序即可

4.5 链式结构应用 多项式算数

我们小学二年级就学过的省略加号的代数和,分开存x的系数和指数,可以把多项式的项可以认为都是相加,如果需要相减把系数改为负数即可,常数项指数为0即可。

总结
数据结构的分层结构,从抽象到具体

数学概念:序列Sequence
抽象数据类型:General list、Stack、Queue
数据结构:(以队列为例)Physical、Linear、Circular、Linked
实现:Array(Linear)、Array+计数器/flag/空格占位(Circular)、两个指针/首尾指针/数组+两个指针(Linked)
应用:排队的人(Physical)、机场模拟

5 递归

5.1 介绍

自程序调用的栈帧,当计算机执行的程序调用另一个程序或子程序的时候,子程序返回需要知道返回到什么位置,因此操作系统需要记录调用方。每一层调用的记录称作栈帧,做法是调用的时候把当前地址或下一个地址压栈,当程序执行完成后从栈中pop出下一条指令的地址继续执行。

这个调用过程中是个树型的结构,被调用的子程序是父程序的子节点。开始的程序是树根、调用层次是树的高度。相同层级的子程序是兄弟节点。。。树的基础定义不再赘述

阶乘定义同理,也是递归定义

汉诺塔游戏,也可以递归。顺带一提九连环也是

注意,计算机递归调用方法是有限制的,不能无限制的递归下去。因此一些时候需要对递归做优化,消除递归调用

5.2 递归原则

设计递归算法的套路是
找到停止规则,也就是基值条件。
找到关键步骤,那个关键步骤是可递归的
列出您的算法伪码或大纲
检查是否可终止
画出递归树

虽然递归好写,但执行需要消耗大量时间和空间。必要时候需要考虑递归的消除
1.分布式,拆分独立的子问题,分布式异步/并行处理
2.单线程处理,压缩存储需要重复执行的内容
3.程序重用,核心程序只有一份
4.栈和树可相互转化

尾递归可直接优化

不能用递归实现的场景
1.阶乘,递归层级会随着输入暴涨
2.斐波那契数列,同理
比较迭代和递归,计算阶乘的时候如果用迭代算法从1开始,空间消耗永远都是1。而递归是从n开始,消耗是O(n)。而斐波那契数列的计算则更离谱,分裂导致了指数级的增长,如果使用迭代则可以消除所有重复任务的计算时间和空间

输出大小的比较,对于斐波那契数列而言输出永远是O(n),而汉诺塔、九连环这类输出是指数级上升的

决定是否使用递归的好方法:
分析递归树,如果简单则可以使用,如果复杂则放弃。处理问题自顶向下设计的时候可以考虑递归,但实现时候要看具体情况决定是否转为迭代算法

5.3 回溯

练习:八皇后/n皇后问题
规则:n*n的棋盘内,皇后棋子两两之间不能在相同的横、竖、对角线上

这里会用到回溯算法,当子问题不可解导致父问题终结时,需要尝试下一个父问题
还会用到一种方法,打印每个单元格的横纵坐标,来观察坐标规律来决定如何实现横竖对角线的判断。当然如果你的平面几何学的足够好,可以直接套用公式或者在公式基础上直接优化实现即可。
直接给结论,如果row-column相等则是f(x)=c-x这条线上的。如果row+column相等则是f(x)=c+x这条线上的,注意数学坐标轴和棋盘是反的。
证明:显然嘛
f(x1) + x1 = c = f(x2) + x2 = y1 + x1 = y2 + x2;
f(x1) - x1 = c = f(x2) - x2 = y1 - x1 = y2 - x2;

优化方案
寻找重复的子问题问题,可以直接记录前一次的运行结果。如果你分析的足够好,可以直接用这个子问题的结果来直接做类似于动态规划的题

回溯算法的效率分析
上限分析
对八皇后来说,总的探索空间有8*8=64个格子,从里面挑选8个皇后的组合C(64,8)有
4426165368个,不会算组合数的回去补下概率论和数理统计,或者复习复习高中数学

如果加上条件限定,每行只能有一个,则这个结果可以减少到8^8=16777216个组合。解释下,每行有8个位置可选选8次,所以是8的8次方个。不是8*8,仔细想想原因!!!

如果继续加限定,每列只能有一个的话,结果减少到8的阶乘,也就是8!=40320个。解释下,每列选完了下一行可选列会少一个,所以是8765432*1=8!

这个数字对计算机来说完全ok,注意实际的程序在发现对角线的时候,会直接停止尝试下一行,直接放弃这个结果,所以总的尝试次数一定小于8!

下限分析
阶乘的增长也是相当快的,因此如果n皇后的n变大,还是很恐怖。
让我们简单思考下,当一个棋子被放置后,就同时排除了同行同列和两个对角线。
对于第1行,回溯算法会尝试n个位置
对于第2行,最少要尝试n-3个位置
对于第3行,最少要尝试n-6个位置
因此,仅仅为了尝试前n/4行,就至少需要n(n − 3)(n − 6). . . (n − 3n/4)这么多次数
估算下,最后一个因子是n/4,前面的因子一定大于n/4,所以结果一定大于(n/4)^(n/4)个位置。这是寻找函数下界的一种方式,虽然不是下确界,但也足够我们分析算法了。不知道下界和下确界有啥区别的同学,建议回去复习高等数学(逃

结果的数量
我们并没有证明计算机可以在n很大的情况下打印出所有答案,只是证明了回溯法是不可能的。获取存在一种算法可以比回溯法更快的计算这个问题,但并不在这个case中。资料显示是可以证明n皇后问题的总数不会低于n的多项式,事实上显然这个数字甚至不能被表达成为k^n,其中k是常数,但这个结论的证明目前还没有(书不是最新的,最新的结论需要查下文献,懒得看了,至少这个书写的时候,还没有证明)

附八皇后代码,
单机版
https://github.com/956237586/DSExperiments/blob/master/DSExperiment2-1/DSExperiment2-1/Queen.c

mpich2分布式版本
https://github.com/956237586/DSExperiments/blob/master/DSExperiment2-1/DSExperiment2-1/Queen-mpich2.c
8皇后共92个答案,8节点机器下测试执行时间为0.017814s
16皇后共14772512个答案,4节点机器下测试执行时间为690.668119s,8节点执行时间358.213900s
有兴趣同学可自行搭建分布式平台测试

下周继续看树型结构
mark 目前是198页5.4 ,pdf是2159页

20220520数据结构绿皮书读书笔记相关推荐

  1. 20220530数据结构绿皮书读书笔记

    个人博客 https://blog.hylstudio.cn/archives/964 20220530数据结构绿皮书读书笔记 9 表格和信息检索 9.1 简介 第七章我们证明过,仅仅使用比较的方式从 ...

  2. 20220518数据结构绿皮书读书笔记

    个人博客 https://blog.hylstudio.cn/archives/945 为了良好的阅读体验,建议到个人博客或CSDN,QQ空间就是备份用的,tx看起来彻底放弃日志了.... 20220 ...

  3. 20220601数据结构绿皮书读书笔记

    个人博客 https://blog.hylstudio.cn/archives/970 20220601数据结构绿皮书读书笔记 11 多叉树 11.1 定义 数学定义上的树有着广泛的概念,它是任意顶点 ...

  4. 20220517数据结构绿皮书读书笔记

    个人博客 https://blog.hylstudio.cn/archives/942 为了良好的阅读体验,建议到个人博客或CSDN,QQ空间就是备份用的,tx看起来彻底放弃日志了.... 20220 ...

  5. 20220527数据结构绿皮书读书笔记书笔记

    个人博客 https://blog.hylstudio.cn/archives/961 20220527数据结构绿皮书读书笔记 8 排序 各种排序算法来咯 插入排序.选择排序.希尔排序.快排.堆排 8 ...

  6. 20220519数据结构绿皮书读书笔记

    个人博客 https://blog.hylstudio.cn/archives/949 20220519数据结构绿皮书读书笔记 2.5.3 优化数据结构的定义 4个层次,1.概念,2.算法,3.编程, ...

  7. 20220513数据结构绿皮书读书笔记

    20220513数据结构绿皮书读书笔记 效率分析 程序运行哪里耗时最长?显然不是输入,因为只有一次,输出一般来说也很快.大量的计算都是在update方法个neighborCount方法的调用上,在每代 ...

  8. 20220512数据结构绿皮书读书笔记

    20220512数据结构绿皮书读书笔记 维护程序的第一步就是review.分析.评估.思考如下几个问题 1.程序是否按需求正确解决了问题? 2.程序在所有条件下都能正常的工作吗 3.程序是否有一个好的 ...

  9. 2012-2-24 《数据结构》读书笔记2 线性表

    "软件只不过是人的思想产物,软件可能是人能造出来的最复杂的实体"这是昨天晚上UML(统一建模语言)老师的一句话,也更加坚定了我学习软件的决心,真的有这么复杂么,其实还是自己不够用心 ...

  10. 《大话数据结构》读书笔记-树

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 6.2 树的定义 6.2.1 结点分类 ...

最新文章

  1. 为什么你问问题,别人都已读不回?
  2. 人工智能军备竞赛:一文尽览全球主要国家AI战略
  3. c#中的模态对话框和非模态对话框
  4. c++ unicode转换中文_彻底弄懂UTF-8、Unicode、宽字符、locale
  5. 树莓派各版本配置对比
  6. CFI/CFG 安全防护原理详解(ROP攻击、DOP攻击、插装检测)
  7. [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求
  8. 是什么让Go语言更适合人工智能研究?
  9. L1-014 简单题 (5 分)
  10. I’m stuck!
  11. jenkins 设置 gitlab web hooks
  12. Python 3.65 pip升级出现ModuleNotFoundError: No module named 'pip'问题
  13. Java语言程序设计(基础篇)
  14. 设计模式之软件设计原则
  15. 多显示器屏幕枚举方法
  16. 数字ic设计——SPI
  17. Access的DateAdd 函数
  18. ndwi是什么意思_ASD是什么意思
  19. 从零学习游戏服务器开发(一) 从一款多人联机实时对战游戏开始
  20. 清除flashback日志

热门文章

  1. c语言 椭圆周长,高中数学公式大全
  2. hibernate枚举类型注解 @Enumerated
  3. 【模拟电子技术Analog Electronics Technology 20】—— 反馈放大电路分析2:各种类型反馈电路的计算分析
  4. raspbain系统连接家庭wifi的配置方法
  5. 雷军,扎克伯格,乔布斯等巨佬的办公桌
  6. Flume1.6.0之Error-protobuf-This is supposed to be overridden by subclasses
  7. CamScanner扫描全能王视频教程-Array老师-专题视频课程
  8. [词根词缀]nomin/norm/not/nounce/nov及词源N的故事
  9. 【https】 1 HTTP Security (bb102-1)
  10. 获取google chrome浏览器的安装位置