2024-2025-1 20241417 《计算机基础与程序设计》第六周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 2024-2025-1计算机基础与程序设计第六周作业
这个作业的目标 <Polya如何解决问题,简单类型与组合类型,复合数据结构,查找与排序算法,算法复杂度,递归,代码安全>
作业正文 https://www.cnblogs.com/lry666666/p/18523142

教材学习内容总结

  1. Polya如何解决问题

    • 理解问题:仔细剖析问题的各个方面,包括明确已知条件、未知元素以及问题的目标。这就像在解一道数学应用题时,要清楚题目中给出的数字、关系,以及最终要求解的答案类型,为后续解题打下基础。
    • 制定计划:依据对问题的理解,从已有的知识储备和解题经验中挖掘可能的解决方案。比如是数学问题就考虑相应公式、定理,若是编程问题就思考合适的算法和数据结构,这是解题的关键构思阶段。
    • 执行计划:按照既定计划认真落实每一个步骤,无论是计算过程还是编程实现,都要保证准确性和逻辑性,确保计划顺利推进。
    • 回顾:对得到的结果进行检验,看其是否符合问题的条件和逻辑。同时,思考是否存在其他更优的解法,进一步提升解题能力。
  2. 简单类型与组合类型

    • 简单类型:编程语言中的基本数据类型,像整数类型(int)用于存储整数数值,如表示人数、数量等;浮点数类型(float)用于存储带有小数部分的数据,如物体的重量、价格等;字符类型(char)则用于存储单个字符,像姓名中的某个字、符号等。它们各自有其特定的存储格式和范围。
    • 组合类型:是将简单类型组合起来的数据形式。数组是一种典型的组合类型,它可以存储多个相同类型的元素,比如整数数组可以存储班级学生的成绩列表。结构体则更灵活,它能把不同类型的数据整合在一起,例如可以创建一个结构体来存储学生的姓名(字符数组)、年龄(整数)和成绩(浮点数),以完整地描述学生信息。
  3. 复合数据结构

    • 链表:由一系列节点组成,每个节点不仅包含数据,还有指向下一个节点的指针。这种结构使得插入和删除操作相对便捷。例如在处理动态变化的数据集合,如实时更新的任务列表时,链表能很好地适应数据的增减。
    • :呈现出层次化的结构,二叉树是其中常见的一种,每个节点最多有两个子节点。它在数据搜索和排序方面有独特优势,比如二叉搜索树可以利用其特性快速定位数据,常用于数据库索引等场景。
    • :由顶点和边构成,能表示各种复杂的关系网络,比如社交网络中人与人之间的朋友关系、城市之间的交通路线等,广泛应用于网络分析、路径规划等领域。
  4. 查找与排序算法

    • 查找算法
      • 顺序查找:从数据结构的起始位置开始,依次对每个元素进行比较,直到找到目标元素或者遍历完整个数据结构。在数据量小或者无序的数据集合中较为适用,不过效率相对较低,时间复杂度在最坏情况下是$O(n)$。
      • 二分查找:要求数据是有序的。通过每次比较中间元素,根据比较结果缩小查找范围,效率较高,时间复杂度是$O(log n)$,常用于有序数据的查找,如有序的字典、电话号码簿等。
    • 排序算法
      • 冒泡排序:通过相邻元素的反复比较和交换,使最大(或最小)的元素像气泡一样逐渐“浮”到数组的一端。算法简单易懂,但时间复杂度为$O(n^2)$,适用于小规模数据的排序,比如对少量数字进行排序。
      • 快速排序:选择一个基准元素,将数组分为小于和大于基准的两部分,然后递归地对这两部分进行排序。平均时间复杂度是$O(n log n)$,是一种高效的排序算法,在大量数据排序场景中广泛应用,如对大型文件中的数据排序。
  5. 算法复杂度

    • 时间复杂度:主要用于衡量算法运行时间随着输入规模增大而变化的趋势,通常用大 O 记号表示。例如,一个简单的单一操作(如变量赋值)时间复杂度是$O(1)$,与输入规模无关;线性搜索算法的时间复杂度是$O(n)$,其运行时间与输入数据量成正比;而像一些嵌套循环的算法可能具有$O(n^2)$等更高阶的时间复杂度。
    • 空间复杂度:用来评估算法在运行过程中所占用的额外空间随输入规模增长的变化情况。比如一个简单的只使用几个固定变量的算法,其空间复杂度是$O(1)$;而递归算法可能因为递归调用栈的深度与输入规模相关,从而具有较高的空间复杂度,如递归计算斐波那契数列可能导致栈空间随着计算规模增大而快速增长。
  6. 递归:是一种编程技术,函数在其自身的定义中直接或间接地调用自身。例如计算阶乘,$n! = n*(n - 1)!$,可以通过递归函数实现,其中基本情况(如0! = 1)是递归的边界条件。递归可以简洁地解决一些具有重复子结构的问题,但如果处理不当可能导致栈溢出等问题,需要谨慎使用。

教材学习中的问题和解决过程(先问 AI)

  • 问题1:在使用 Polya 方法解决问题时,如果制定的计划执行不下去怎么办?
  • 问题1解决方案:可以回到制定计划步骤重新思考,检查计划是否存在不合理之处,比如是否对问题的某些条件理解有误或者选择的方法不适用。也可以尝
    试从其他角度制定新的计划,还可以参考类似问题的解决方法或者向他人请教。
  • 问题2:简单类型中的布尔类型(bool)常用于什么场景?
  • 问题 2 解决方案:布尔类型常用于表示条件判断的结果,比如在程序中判断某个条件是否满足。例如,判断用户是否登录(登录为 true,未登录为 false)、判断某个数是否大于另一个数(大于为 true,小于等于为 false)等场景。在逻辑控制语句(如 if - else 语句)中经常使用布尔类型的值来决定程序的执行路径。
  • 问题 3:在复合数据结构中,图的遍历有哪些常用算法?
  • 问题 3 解决方案:图的遍历常用算法有广度优先搜索(BFS)和深度优先搜索(DFS)。广度优先搜索从起始顶点开始,先访问其所有邻接顶点,再依次访问这些邻接顶点的邻接顶点,一层一层地向外扩展,通常使用队列来实现。深度优先搜索则是从起始顶点开始,沿着一条路径尽可能深地访问顶点,直到无法继续,然后回溯到前一步继续探索其他路径,通常使用栈来实现(递归实现本质上也是利用了栈)。
  • 问题 4:对于查找算法,如果数据是动态变化的(有插入和删除操作),哪种查找算法比较合适?
  • 问题 4 解决方案:如果数据是动态变化的,可以考虑使用哈希表实现的查找算法。哈希表可以在平均情况下以的时间复杂度进行查找、插入和删除操作。虽然在最坏情况下可能出现哈希冲突导致性能下降,但通过合适的哈希函数和冲突解决策略,可以在大多数情况下保持高效。另外,一些平衡二叉搜索树(如红黑树)也可以用于动态数据的查找,其查找、插入和删除操作的时间复杂度都是。
  • 问题 5:如何理解算法复杂度中的平均情况复杂度和最坏情况复杂度?
  • 问题 5 解决方案:平均情况复杂度是指在所有可能的输入情况下,算法运行时间或空间的平均值。它考虑了各种不同输入的概率分布。例如,快速排序在平均情况下时间复杂度是,是假设输入数据的各种排列出现的概率是均匀的。最坏情况复杂度则是算法在最不利的输入情况下的复杂度。对于快速排序,最坏情况是输入数据已经有序或接近有序,此时时间复杂度会退化为。理解这两种复杂度有助于评估算法在不同场景下的性能表现。
  • 问题 6:递归函数在调用自身时,如何确保不会陷入无限循环?
  • 问题 6 解决方案:需要设置正确的终止条件(或边界条件)。例如在计算阶乘的递归函数中,当输入为 0 或 1 时返回 1,这就是终止条件。在遍历树结构的递归函数中,当遇到叶子节点(没有子节点的节点)时停止递归。每次递归调用都要朝着满足终止条件的方向前进,这样才能保证递归函数正常结束,不会无限循环。
  • 问题 7:在代码安全中,对于文件上传功能,如何防止安全漏洞?
  • 问题 7 解决方案:首先要对上传的文件类型进行严格限制,只允许特定类型的文件上传,比如在图片上传功能中,只允许常见的图片格式(如 jpg、png 等)。对文件名进行过滤,防止包含特殊字符或路径遍历字符(如 “../”)的文件名。还要限制上传文件的大小,避免过大文件占用过多资源。此外,将上传的文件存储在服务器特定的、安全的目录下,避免文件被不当执行或访问,例如不能将用户上传的文件存储在可执行脚本目录下

基于AI的学习

我:我在学算法复杂度和递归知识点,请你以苏格拉底的方式对我进行提问,一次一个问题。
GPT:那你先说说,为什么算法复杂度对于评估一个算法是重要的呢?
我:因为它能让我们知道算法的效率,随着输入规模变化算法运行时间或空间的变化情况。
GPT:那你觉得这种评估只对大型输入规模有意义吗?
我:不是,不同规模下都有意义,只是在大型规模下差异更明显。你的理解(回答)是什么?
GPT:我认为即使是小规模输入,算法复杂度分析也能帮助我们选择更合适的算法,不过在大规模输入时,复杂度的影响更加显著,比如可能导致程序运行时间从秒级到无法承受的时长。
GPT:那我们谈谈递归,递归函数和普通函数最大的区别在哪里?
我:递归函数会在自己的函数体内调用自己,普通函数不会。
GPT:那这种自我调用会带来什么潜在的问题呢?
我:可能会导致栈溢出,如果没有正确的终止条件的话。你的理解(回答)是什么?
GPT:没错,当递归调用的深度过深,超过了栈的存储容量时,就会出现栈溢出。而且如果递归没有朝着终止条件发展,也会陷入无限循环。
我:针对我算法复杂度和递归知识点,我理解了吗?
GPT:你已经有了一定的理解,但可以再深入思考一些复杂场景下的应用。
我:我的回答结束了,请对我的回答进行评价总结。
GPT:你对算法复杂度和递归的基本概念理解得比较准确,能够回答出它们的核心要点,如算法复杂度对评估算法效率的作用,递归函数的特性和潜在问题。不过在实际应用场景、算法复杂度分析的细节以及递归与其他编程概念结合等方面,还可以进一步探索和学习。

代码调试中的问题和解决过程

  • 问题1:忘记加取地址符
  • 问题1解决方案:多练

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 0/2 18/38
第三周 500/1000 1/3 22/60
第四周 300/1300 1/4 30/90
第五周 300/1600 1/5 30/120
第六周 300/1900 1/6 30/150
posted @ 2024-11-03 12:39  20241417罗若元  阅读(8)  评论(0编辑  收藏  举报