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

20220513数据结构绿皮书读书笔记
效率分析
程序运行哪里耗时最长?显然不是输入,因为只有一次,输出一般来说也很快。大量的计算都是在update方法个neighborCount方法的调用上,在每代update都需要重新计算每个细胞的邻居,在一个常见的布局中,可能仅有5%的细胞是存活的,并且集中在一个区域。因此update会消耗大量的时间在计算死亡的细胞上,他们没有存货的邻居,也不可能复活。如果95%的细胞都死了,那么下一代的计算是相当没有效率的
但是这种性能下降重要吗?一般来说不重要,因为对用户来说计算可以很快的完成,看起来就是一瞬间的事情。反过来说,如果你在一个很垃圾的电脑上运行这个程序,或者是分时的系统上,你才可能需要找出程序的时间耗费在了哪里。但是一般来说,优化这个程序的运行时间是没有必要的,即使它的效率并不高

编程原则
除非必要,否则不要去优化你的代码
当你的程序没有完成且正确运行的情况下不要开始优化
大多数程序90%的时间会花费在10%的指令上。找到这10%,把你的精力花费在这上面

另外一个原因就是优化一个程序通常会产生很复杂的代码,当程序需要修改的时候这会变得更加困难

编程原则
保持你的算法尽可能的简单,当有疑问选择最简单的方式实现

为了修订程序添加的边界限制,需要使用我们还没写的数据结构,等到了9.9章的时候,我们会重新来看这个程序,在那时候我们会找出一个更加高效的算法,因此那个新的程序会更加的通用以及有更好的计算效率

编程原则
有时候推迟问题可以简化解决方案(凡事三思而后行:能不能不做?能不能别人做?能不能明天做?)

思考题
如何让矩阵的宽度也由用户输入?把常量改了呗,改成变量,推迟申请数组内存的时间
一个提高性能的办法是删掉周围一圈边界,这样计算边界的时候就不用算那些永远都是0的格子了。这种做法在这个联系里值得做么? 显然不值,边界占比才多少- -

P1. 修改程序的初始化方法,接受连续的空字符和多个x作为存活的表示。代替现有的坐标输入方式
代码自己改吧,懒得写,就是换下读取函数而已

P2. 支持从文件读初始值,同样是改输入函数

P3.当程序结束的时候,输出最后一次的布局到文件里,给上一个问题用

P4. 在任意一代生成的时候,支持用户可以手动编辑插入新的存活细胞

P5. 在任意一代生成时,如果用户想看帮助,支持打印帮助

P6. 增加单步模式,解释每一个细胞的变化和原因
你看我说什么来着,肯定有新需求,你要是第一版没记,实际工作加这种需求就GG了

P7. 使用光标定位功能来让打印局部更新,而不是完整输出所有布局
关于命令行的光标定位功能本质上也是一系列的特殊字符,但是麻烦的是当你想局部更新的时候,需要计算要更新的坐标和当前光标的坐标才能知道输出什么控制字符
这个会很有意思,但是我懒得动hhhh 看看得了,我确认我写的出来的我就不写了

P8. 使用不同的颜色来表示每一代变化了和没变化的细胞
这个同样也是7里的控制字符,有的控制字符能修改后续字符的颜色,准备好打印之前修改对应字符的颜色就好了,难点是需要额外信息记录哪个变了

本章内容均为基础,看了下主要的部分,其中一些在后面会逐渐加深难度,其他的将会在其他课程中学习,还有一些需要在实践中学习

软件工程的实际周期
1.完整的分析需求,确认需求的合理性
2.构建原型和实验直到所有的需求都满足
3.设计算法和数据结构
4.验证算法的正确性,或者让算法足够简单来保证有足够的自信确认
5.分析算法来确定它的依赖并且确认满足需求
6.编码实现
7.用合适的测试数据来评估程序
8.重构程序使其足够的functional,不知道怎么翻译,意思应该是可重用
9.当必要的时候,优化代码来提高性能
10.维护程序,面对后续用户所需要的更改

问题分析
因用户说的和计算机科学天然有鸿沟,所以以下问题用户必须理解
1. What form will the input and output data take? How much data will there be?
格式可以让产品定义好,但必须满足第一范式。不满足则继续追问
多少数据产品有概率不知道,可能得自己算

2. Are there any special requirements for the processing? What special occurrences will require separate treatment?
特殊逻辑,也是产品给。没给就是没有

3. Will these requirements change? How? How fast will the demands on the
system grow?
需求会变不会变的产品自己都不知道。。。更不用提变得多快了,pass

4. What parts of the system are the most important? Which must run most efficiently?
拿部分都重要,出bug就得修。。。不被测试和用户发现的bug那能是bug么?那是feature
大部分都不需要啥效率,能跑就得了,但设计上还是要最佳的方案,免得有坑。

5. How should erroneous data be treated? What other error processing is needed?
错误的数据拒绝处理,但要保证系统能正常对其他数据运行。最坏情况下影响到个别人可以接受,但影响所有人不可以

6. What kinds of people will use the software? What kind of training will they have? What kind of user interface will be best?
非后台开发需要考虑的,丢给前端和产品

7. How portable must the software be, so that it can move to new kinds of equipment? With what other software and hardware systems must the project be
compatible?
后台来说不需要,linux能跑就行

8. What extensions or other maintenance are anticipated? What is the history of previous changes to software and hardware
设计时有犹豫的,就留出扩展。记录原始数据备用。历史上改的东西只有天知地知git知

mark 目前是41页第1.6.3,pdf是58页
明天和后天看心情更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值