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

代码托管

10000以内自幂数

上周考试错题总结

  • 错题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小时

参考资料

posted @ 2021-11-02 16:00  20211408王其  阅读(57)  评论(0编辑  收藏  举报