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

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

作业信息

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

教材学习内容总结

Polya如何解决问题
(一)、理解问题

明确问题的目标是什么。你需要清楚地知道要解决的问题最终要达到什么样的结果。
确定问题中的已知条件。仔细分析问题中给出了哪些信息,这些信息对于解决问题至关重要。

(二)、制定计划

尝试不同的方法。可以通过直观猜测、类比、从特殊情况推广到一般情况等方式来寻找解决问题的思路。
选择合适的策略。比如倒推法、归纳法、分情况讨论等,根据问题的特点选择最有可能成功的策略。

(三)、执行计划

认真按照选定的计划进行操作。在这个过程中要保持细心和耐心,确保每一步的计算和推理都是准确的。
记录中间过程。如果遇到问题可以回溯中间步骤,检查是否有错误,同时也方便后续的复查和总结。

(四)、回顾反思

检查答案是否正确。将得到的结果代入原问题中进行验证,确保解决方案的准确性。
总结解决问题的方法。思考在这个过程中用到了哪些技巧和策略,下次遇到类似问题可以更加高效地解决。
拓展问题。考虑问题是否可以有其他的解法,或者对问题进行变形,进一步加深对问题的理解和掌握。

简单类型与组合类型
一、简单类型

简单类型通常也被称为基本类型或原子类型,它代表单个的、不可再分的值。

例如:

在许多编程语言中,整数类型(如 int)就是一种简单类型。你可以用它来存储整数值,比如年龄、数量等。整数类型通常有特定的取值范围,不同的编程语言可能会有所不同。
浮点数类型(如 float、double)也是常见的简单类型。它用于存储带有小数部分的数值,比如身高、体重等。浮点数类型同样有其精度和取值范围的限制。
字符类型(如 char)用于存储单个字符,比如字母、数字、标点符号等。
布尔类型(bool)只有两个值,即真(true)和假(false),通常用于表示条件判断的结果。

简单类型的特点:

占用的内存空间相对较小,因为它们只存储单个值。
操作相对简单,通常可以直接进行算术运算、比较运算等。
容易理解和使用,对于初学者来说比较友好。

二、组合类型

组合类型是由多个简单类型或其他组合类型组合而成的复杂数据结构。

例如:

数组是一种组合类型,它可以存储多个相同类型的元素。你可以创建一个整数数组来存储一组数字,或者创建一个字符数组来存储一个字符串。
结构体(在一些语言中也称为记录)是另一种组合类型,它可以将不同类型的变量组合在一起,形成一个新的类型。比如,可以定义一个结构体来表示一个学生的信息,包括姓名、年龄、成绩等。
类(在面向对象编程语言中)也是一种强大的组合类型,它可以封装数据和操作,通过定义属性和方法来描述一个对象的特征和行为。

组合类型的特点:

可以表示更复杂的数据结构,能够满足更广泛的编程需求。
通常需要更多的内存空间来存储数据。
操作相对复杂,需要使用特定的方法和函数来访问和修改其中的数据。

复合数据结构
一、常见的复合数据结构类型

数组与链表的组合
例如,在某些编程语言中,可以使用数组来实现链表的节点存储,这样既能利用数组的随机访问特性,又能实现链表的动态增长和删除操作。
这种组合可以在一定程度上克服数组大小固定和链表访问效率低的缺点。
栈与队列的组合
可以构建一个数据结构,同时具有栈和队列的特性。例如,在某些场景下,需要按照先入先出(队列)和后入先出(栈)的方式处理数据。
通过巧妙的设计,可以在一个数据结构中实现两种不同的操作模式。
树与图
树是一种分层的数据结构,而图则是更为复杂的节点和边的组合。
可以将树看作是一种特殊的图,例如二叉树可以用图的方式表示,节点之间通过边连接。
同时,图的某些算法也可以应用于树的处理,比如遍历算法。
哈希表与其他数据结构的组合
哈希表可以与数组、链表等结合使用。当哈希冲突发生时,可以使用链表来存储冲突的元素。
这样可以提高数据的查找效率,同时也能处理哈希冲突的情况。

二、复合数据结构的优点

灵活性高
可以根据具体的需求组合不同的数据结构,满足各种复杂的应用场景。
例如,在数据库系统中,可能需要使用多种复合数据结构来存储和管理数据。
效率提升
通过合理的组合,可以充分发挥不同数据结构的优势,提高数据处理的效率。
比如,哈希表与链表的组合可以在保证快速查找的同时,有效地处理哈希冲突。
功能强大
能够实现更复杂的功能,如动态数据存储、高效的搜索和排序等。
例如,红黑树是一种平衡二叉搜索树,它结合了二叉搜索树和颜色标记的特性,具有高效的插入、删除和查找操作。

三、复合数据结构的应用场景

操作系统
在操作系统中,内存管理、进程调度等功能通常需要使用复合数据结构来实现。
例如,使用链表和页表来管理内存页面,使用二叉树或堆来进行进程调度。
数据库系统
数据库中的索引结构、存储结构等往往是复合数据结构。
比如,B 树和 B+树是常用的数据库索引结构,它们结合了多个节点和指针,能够高效地进行数据存储和查找。
图形图像处理
在图形图像处理中,需要使用各种复合数据结构来表示图像的像素信息、图形的顶点和边等。
例如,四叉树可以用于图像的分割和压缩,图可以用于表示图像的拓扑结构。
算法设计
许多算法需要使用复合数据结构来实现高效的计算。
比如,图算法中的最短路径算法、最小生成树算法等都需要使用图这种复合数据结构。

查找与排序算法
一、查找算法

顺序查找
原理:从数据集合的开头依次遍历每个元素,直到找到目标元素或遍历完整个集合。
适用场景:数据集合较小、无序或者没有特定的结构要求时。
优点:实现简单,不需要对数据进行预处理。
缺点:查找效率较低,特别是在数据量大时。
二分查找
原理:对于有序的数据集合,每次将查找区间分为两部分,根据目标元素与中间元素的大小关系确定下一步查找的区间。
适用场景:数据集合有序,且频繁进行查找操作。
优点:查找效率高,时间复杂度为 O(log n)。
缺点:要求数据集合必须有序,且不适合动态变化的数据集合。
哈希查找
原理:通过哈希函数将目标元素的关键值映射到一个特定的位置,然后直接在该位置进行查找。
适用场景:需要快速查找大量数据,且数据的关键值分布比较均匀。
优点:查找速度非常快,时间复杂度接近 O(1)。
缺点:需要额外的存储空间来存储哈希表,且可能存在哈希冲突。

二、排序算法

冒泡排序
原理:重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
适用场景:数据量较小,对算法效率要求不高的情况。
优点:实现简单,容易理解。
缺点:效率较低,时间复杂度为 O(n²)。
快速排序
原理:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
适用场景:数据量大,对算法效率要求较高的情况。
优点:平均时间复杂度为 O(n log n),效率较高。
缺点:在最坏情况下时间复杂度为 O(n²),不稳定。
归并排序
原理:采用分治策略,将待排序序列分成若干个子序列,分别进行排序,然后将排好序的子序列合并成一个有序的序列。
适用场景:数据量大,对算法稳定性要求较高的情况。
优点:时间复杂度稳定为 O(n log n),且是稳定的排序算法。
缺点:需要额外的存储空间。
插入排序
原理:将未排序的数据逐个插入到已排序的序列中,使得插入后的序列仍然有序。
适用场景:数据量较小,或者部分数据已经有序的情况。
优点:实现简单,在数据基本有序时效率较高。
缺点:时间复杂度为 O(n²),效率较低。

递归
一、递归的定义和原理

递归是指一个函数在其定义中直接或间接地调用自身的过程。其基本原理是将一个大问题分解为一个或多个与原问题相似但规模较小的子问题,通过不断地解决这些子问题,最终解决原问题。

例如,计算阶乘的问题。阶乘的定义是 n! = n × (n - 1) × (n - 2) ×... × 2 × 1。可以用递归的方式来定义阶乘函数:当 n = 0 或 n = 1 时,n! = 1;当 n > 1 时,n! = n × (n - 1)!。这里,factorial(n)函数在计算 n 的阶乘时调用了 factorial(n - 1),即自身。

二、递归的组成部分

基线条件(Base Case):这是递归的终止条件,当满足基线条件时,递归不再继续调用自身。在阶乘的例子中,n = 0 或 n = 1 就是基线条件。
递归步骤(Recursive Step):在这个部分,函数调用自身来解决较小规模的子问题。在阶乘的例子中,n! = n × (n - 1)!就是递归步骤。

三、递归的优点

简洁性:递归可以使代码更加简洁和易于理解。对于一些具有明显递归结构的问题,使用递归可以避免复杂的循环和状态管理。
可读性:递归代码通常更符合问题的自然描述,使得程序的逻辑更加清晰。
通用性:递归可以用于解决各种类型的问题,包括数学计算、图形处理、数据结构操作等。

四、递归的缺点

性能问题:递归可能会导致性能开销较大,因为每次递归调用都需要分配额外的内存空间用于存储函数的参数和局部变量。此外,递归调用可能会导致栈溢出,特别是当递归深度较大时。
可读性问题:对于不熟悉递归的人来说,递归代码可能较难理解。而且,如果递归的逻辑不清晰,可能会导致错误难以调试。

五、递归的应用场景

数学计算:如阶乘、斐波那契数列等问题可以用递归轻松解决。
数据结构:遍历树、图等数据结构时,递归是一种常用的方法。
分治算法:如快速排序、归并排序等算法都是基于递归实现的。

代码安全
一、代码安全的重要性

保护用户数据
用户信任软件能够妥善保护他们的个人信息、财务数据等敏感内容。如果代码存在安全漏洞,可能导致用户数据被窃取、篡改或泄露,给用户带来严重的损失和风险。
例如,在金融类应用中,用户的银行账户信息、交易记录等必须得到严格的保护,否则可能引发金融诈骗等严重后果。
确保系统稳定性
不安全的代码可能会被恶意攻击者利用,导致系统崩溃、服务中断等问题。这不仅会影响用户体验,还可能给企业带来巨大的经济损失。
比如,一个受到网络攻击的电子商务网站可能无法正常处理订单,导致业务停滞,损失大量的销售额和客户信任。
维护企业声誉
一旦软件系统出现安全问题,企业的声誉将受到严重损害。用户可能会对企业的产品和服务失去信心,转而选择竞争对手的产品。
例如,知名的科技公司如果发生重大的数据泄露事件,可能会面临公众的质疑和批评,影响其品牌形象和市场竞争力。

二、常见的代码安全问题

注入攻击
SQL 注入:攻击者通过在用户输入中插入恶意的 SQL 语句,从而获取或篡改数据库中的数据。
命令注入:攻击者在输入中插入恶意的系统命令,使系统执行这些命令,从而获取系统权限或破坏系统。
解决方案:对用户输入进行严格的验证和过滤,避免直接将用户输入拼接到 SQL 语句或系统命令中。使用参数化查询、存储过程等技术可以有效防止 SQL 注入。
跨站脚本攻击(XSS)
攻击者在网页中注入恶意脚本,当用户浏览该网页时,恶意脚本会在用户的浏览器中执行,从而窃取用户的信息或进行其他恶意操作。
解决方案:对用户输入进行编码和过滤,避免将用户输入直接输出到网页中。使用内容安全策略(CSP)可以限制网页中可以执行的脚本来源。
跨站请求伪造(CSRF)
攻击者诱导用户在已登录的状态下访问恶意网站,该网站会向目标网站发送伪造的请求,从而执行一些用户不知情的操作。
解决方案:在关键操作中使用验证码、添加 token 验证等方式,确保请求是由用户自愿发起的。
权限提升
攻击者利用代码中的漏洞获取更高的权限,从而可以访问和修改系统中的敏感数据或执行其他危险操作。
解决方案:严格控制用户权限,避免不必要的权限提升。对系统中的敏感操作进行严格的权限检查。

三、确保代码安全的方法

安全编码规范
遵循安全编码规范,如输入验证、输出编码、错误处理等,可以有效减少代码中的安全漏洞。
例如,使用安全的函数库,避免使用已知存在安全问题的函数。
代码审查
进行定期的代码审查,由专业的开发人员或安全专家对代码进行检查,发现潜在的安全问题。
代码审查可以包括静态代码分析、动态测试等多种方式。
安全测试
进行各种安全测试,如漏洞扫描、渗透测试等,以发现系统中的安全漏洞。
安全测试应该在开发过程的不同阶段进行,包括单元测试、集成测试、系统测试等。
及时更新和维护
及时更新软件系统中的库、框架和其他依赖项,以修复已知的安全漏洞。
对系统进行定期的维护和监控,及时发现和处理安全事件。

posted @ 2024-11-03 15:54  雾岛岛岛  阅读(6)  评论(0编辑  收藏  举报