2021-2022-1 20211408 《信息安全专业导论》第七周学习总结
2021-2022-1 20211408 《信息安全专业导论》第七周学习总结
作业信息
这个作业属于哪个课程 | 2020-2021-1信息安全专业导论 |
---|---|
这个作业要求在哪里 | 2020-2021-1信息安全专业导论第七周作业 |
这个作业的目标 | 数组与链表、基于数组和基于链表实现数据结构、无序表与有序表、树、图、子程序与参数 |
作业正文 | 求最大公约数的伪代码、实现进制转化伪代码、Fibnacci数列递归实现 |
教材学习内容总结
- 区分基于数组的实现和链式实现:
- 数组的实现中,每个数据都被明确编码,方便直接按编码检索,但是由于编码的固定性,难以对数组进行更改。
- 链式实现:类似于“接头式”结构,像火车车厢一般,便于增添删减其中的项目,但是检索时间长。
- 链式结构(linked structure):一个将数据和找到下一项位置的信息保存到同一容器的实现方法。
- 区分数组和列表:
- 数组:难以改变,大小相对固定,内嵌结构,高效检索
- 列表:容易改变,大小不定,抽象结构,灵活但失去一定效率
- 区分无序列表和有序列表:
- 无序列表:顾名思义,无顺序,项目被随意被放入其中。
- 有序列表:顾名思义,有顺序,项目之间具有语义关系。
- 区分栈和队列的行为:
- 栈:后进先出,如同超市货架上的商品,最后被码入的一排是最先被拿到的一排。
- 队列:先进先出,如同排队买奶茶,先到先得。
- 区分二叉树和二叉检索树:
- 二叉树:具有唯一起始节点的抽象复合结构,其中每个节点可以有两个子女节点,根节点和每个节点之间都有且只有一条路径。
- 二叉检索树:具有二叉树的形状属性,此外,二叉检索树还具有语义属性来刻画树中节点上的值,即任何节点的值都要大于它左子树中的所有节点的值,并且要小于它的右子树中的所有节点的值
总之,后者在前者的基础上增加了一定的属性
- 建立二叉检索树的过程:
首先按照顺序插入第一个值,再插入下一个值,若它大于第一个值,则将之放入右子树,反之则放入左子树,下一个数再与第一个值开始比较重复上述操作并循环直至结束。 - 理解树与图的区别:
- 树的一个节点至多只有一个指向它的节点。
- 图有一组节点和连续节点的线段构成。
总之,树有且仅有一个节点指向它的节点,图没有这种限制
- 解释子程序和参数的概念:
- 子程序:我将它和复合函数联系在一起,即“套娃”。
- 参数:同样和复合函数联系。复合函数中,y=sin(x2),其中,y=sinu,u=x2,u就是参数
- 区分值参与引用参数:
- 值参:由调用单元传入实参的副本的形参。
- 引用参数:由调用单元传入实参的地址的形参
总之,二者都是形参,前者是子程序可以直接访问内容,后者子程序访问地址
教材学习中的问题和解决过程
- 问题1:数组和列表有什么区别
- 问题1解决方案:首先,教材中写道:
数组是内嵌结构,列表是抽象结构。然而列表应用于数组中
后又通过百度,搜索到:
两者之间的区别:
一,空间大小:
1,)Array的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小。
2,)ArrayList的空间是动态增长的,如果空间不够,它会创建一个空间比原空间大一倍的新数组,然后将所有元素复制到新数组中,接着抛弃旧数组。而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。
二,存储内容
1,)Array数组可以包含基本类型和对象类型,
2,)ArrayList却只能包含对象类型。 但是需要注意的是:Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。
三,方法:
ArrayList作为Array的增强版,当然是在方法上比Array更多样化,比如添加全部addAll()、删除全部removeAll()、返回迭代器iterator()等。
适用场景:
如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就选择ArrayList。而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。
最终,我明白了二者的区别。首先是类型上不同,其次是元素不同,接着是包含关系不同,数组包括了列表。
-
问题2:教材P171的那个例子与二叉检索树中,我认为有一处写错了,在文字描述中,写的是sue,而在图形中就变成了Sarah。
-
问题3: 还是教材P171,为什么june的路径是在becca的右子树,而不在phil处成为kate的左子树
-
问题3解决方案:我重新看了一遍例子,发现它是按照一定字符串顺序进行绘制二叉检索树的。顺序如下:
john、phil、lila、kate、becca、judy、june、mari、jim、sue
按照该顺序进行填写绘制,于是我明白了原因。
代码调试中的问题和解决过程
- 问题1:在四位数里找“水仙花数”的代码里,起初我完全照搬水仙花数的概念。水仙花数,即三个数位上的数的三次方的和还是它本身。因此对四位数我仍然沿用四个数位上的数的三次方的和是它本身,然而没有找到结果。
- 问题1解决方案:我察觉到不太对劲,我觉得肯定是我有问题,因此我通过上网搜索,了解到,水仙花数属于自幂数,其中:
各种自幂数的名称
一位自幂数:独身数
两位自幂数:没有
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
于是对我的代码进行了修改,如下:
#coding=utf-8
i = 0; a = 0
for item in range(0,10):
a = i
if i == a:
print("i = "+str(i))
i = i + 1
i = 10; a = 0; b = 0
for item in range(10,100):
a = i // 10
b = i - a*10
if i ==(a*a+b*b):
print("i = "+str(i))
i = i + 1
i = 100; a = 0; b = 0; c = 0
for item in range(100,1000):
a = i // 100
b = (i - a * 100) // 10
c = i - a * 100 -b * 10
if i == (a ** 3 + b ** 3 + c ** 3):
print("i = " + str(i))
i = i + 1
i = 1000; a = 0; b = 0; c = 0; d = 0
for item in range(1000,10000):
a = i // 1000
b = (i - a * 1000) // 100
c = (i - a * 1000 - b * 100) // 10
d = i % 10
if i == (pow(a,4)+pow(b,4)+pow(c,4)+pow(d,4)):
print("i = " + str(i))
i = i + 1
运行结果是:
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 153
i = 370
i = 371
i = 407
i = 1634
i = 8208
i = 9474
代码托管
上周考试错题总结
- 错题1:The input to an assembler is an assembly language program.
该题应是正确,汇编器的输入是汇编语言程序。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 | |
第五周 | 300/1600 | 3/11 | 30/120 | |
第六周 | 300/1900 | 3/14 | 30/150 | |
第七周 | 500/2400 | 4/18 | 40/190 |
-
计划学习时间:40小时
-
实际学习时间:40小时
参考资料
- 《计算机科学概论》
- ...