2024-2025-1 20241328 《计算机基础与程序设计》第十一周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第一周作业 |
这个作业的目标 | 计算机网络,网络拓扑,云计算,网络安全,Web,HTML,CSS,Javascript,XML |
教材学习内容总结
计算机科学概论(第七版)和《C语言程序设计》第10章知识点总结
目录
第15章:图
15.1 图的基本概念
- 图的定义:图是由顶点(或节点)和边组成的一种数据结构,表示对象之间的关系。
- 图的种类:
- 无向图:边没有方向,表示顶点之间的双向关系。
- 有向图:边有方向,表示顶点之间的单向关系。
- 加权图:边上带有权值,通常表示边的长度、费用等。
15.2 图的表示
-
邻接矩阵:使用二维数组表示图,适合稠密图。
- 如果两个顶点有边相连,则对应的元素为1(或边的权值),否则为0。
- 优点:访问边的时间复杂度为O(1)。
- 缺点:空间复杂度为O(n²),不适合稀疏图。
-
邻接表:使用链表或动态数组表示每个顶点的边,适合稀疏图。
- 每个顶点维护一个链表,存储与其相连接的所有顶点。
- 优点:节省空间,适合表示稀疏图。
- 缺点:访问边的时间复杂度为O(n)。
15.3 图的遍历
- 深度优先搜索(DFS):基于栈的数据结构,尽可能深入每一个分支。
- 广度优先搜索(BFS):基于队列的数据结构,逐层遍历各个节点。
15.4 最短路径算法
- Dijkstra算法:用于有向图的最短路径寻找,适用于非负权边。
- Bellman-Ford算法:适用于有向图,可处理负权边。
第16章:人工智能
16.1 人工智能的定义
- 人工智能(AI):研究和开发智能机器的科学,特别是智能计算机程序。
16.2 人工智能的领域
- 机器学习:通过经验和数据来改善决策过程,常用算法包括决策树、神经网络等。
- 自然语言处理:使计算机能够理解和生成人类语言的重要领域。
- 计算机视觉:让计算机理解和处理图像和视频。
16.3 基础算法
- 启发式算法:通过使用启发性规则来寻找近似解,常用于图搜索和优化问题。
- 侦测算法:涉及图像识别、模式识别等。
16.4 人工智能的挑战
- 伦理问题:人工智能的应用在隐私、安全等方面引发的伦理和法律争议。
- 技术问题:如何处理不确定性、数据量大、复杂性高的问题。
第10章:结构化程序设计
10.1 程序设计的基础
- 结构化程序设计:强调模块化和分治思想,增强可读性和可维护性。
- 三大基本结构:顺序、选择、循环结构。
- 顺序结构:语句按顺序执行。
- 选择结构:根据条件选择不同的执行路径,使用
if
、switch
等语句。 - 循环结构:用于重复执行代码块,使用
for
、while
、do-while
等语句。
10.2 函数的使用
- 函数定义:包含返回类型、函数名、参数列表及函数体。
- 参数传递:
- 值传递:传递参数的值,函数内部对参数的改动不影响实际参数。
- 地址传递:传递参数的地址,允许函数修改实际参数的值。
- 递归函数:函数调用自身,需设定有效的终止条件。
10.3 数组和字符串
- 数组:相同类型元素的集合,支持随机访问。
- 字符串:在C语言中为字符数组,以
\0
结尾表示字符串的结束。
10.4 指针
- 指针的定义:存储变量地址的变量。
- 指针运算:可以通过指针遍历数组及传递到函数等。
- 指向指针的指针:指向其他指针的指针,增加了数据结构的灵活性。
10.5 文件操作
- 文件的打开和关闭:使用
fopen
和fclose
函数。 - 读写文件:使用
fscanf
、fprintf
等进行数据输入输出。 - 文件操作的错误处理:检查返回值以确保文件操作成功。
教材学习中的问题和解决过程(先问 AI)
-
问题1:我看了这一段文字 “图的遍历方式包括深度优先搜索(DFS)和广度优先搜索(BFS)。”,有这个问题:这两种遍历方式的具体区别是什么?在什么情况下使用哪一种更合适?
-
我查了资料,有这些说法:“深度优先搜索(DFS)优先深入图中的分支,比较适合解决路径查找问题;广度优先搜索(BFS)则是逐层遍历,更适合寻找最短路径。”
-
根据我的实践,我得到这些经验:在我的项目中实现图的遍历时,我发现使用DFS时能找到较深的节点,但搜索速度较慢,并且在处理较大的图时会消耗更多的内存。而BFS在寻找到某个节点的最短路径时工作得更好,但对于深层节点的搜索效率不高。
-
但是我还是不太懂,我的困惑是:在实际应用中,如何判断选择使用DFS还是BFS?它们之间的效率差异如何评估?
-
-
问题2:我看了这一段文字 “人工智能的领域包括机器学习、自然语言处理和计算机视觉。”,有这个问题:这些领域之间的实际联系和差异是什么?
-
我查了资料,有这些说法:“机器学习是AI的重要方法,通常通过训练模型来进行预测;自然语言处理则是使计算机理解和生成语言的技术,计算机视觉则是使计算机能够理解和分析图像或视频。”
-
根据我的实践,我得到这些经验:我在尝试构建一个聊天机器人时,结合了自然语言处理和机器学习技术。通过训练模型识别人类的语句,找到了更高效的交流方式。但是,将这两者结合得当却是个挑战。
-
但是我还是不太懂,我的困惑是:在具体项目中,如何有效地集成这三者的技术?有没有一些最佳实践可以遵循?
-
-
问题3:我看了这一段文字 “在C语言中,递归函数允许函数调用自身,并需要明确的终止条件。”,有这个问题:如何确保递归函数不会导致栈溢出?
-
我查了资料,有这些说法:“确保递归函数有有效的基准条件,防止无限递归;此外,可以使用递归深度的限制来防止过多的递归调用。”
-
根据我的实践,我得到这些经验:我曾尝试使用递归求解斐波那契数列,初次实现时期望得到结果,但因为基准条件设置不当导致了栈溢出。我后来改为使用迭代方式解决,得到了更好的性能。
-
但是我还是不太懂,我的困惑是:有时候递归比较自然,但在实际项目中,如何判断递归深度是否超出限制?在使用递归时还有哪些潜在的风险需要关注?
-
基于AI的学习
学习过程模拟:图的基本概念
我在学图的基本概念,请你以苏格拉底的方式对我进行提问,一次一个问题。
问题1
GPT: 你能告诉我,什么是图吗?在你的理解中,图的基本组成部分是什么?
我: 图是由顶点和边组成的一种数据结构,顶点是图中的节点,而边则表示节点之间的关系。
问题2
GPT: 那么,顶点和边之间的关系是什么样的?你能举一个例子说明吗?
我: 顶点是图的基本单位,边连接两个顶点,表示它们之间的关系。例如,在社交网络中,用户可以是顶点,而用户之间的朋友关系是边。
问题3
GPT: 很好。那么,可以告诉我图中有哪几种类型吗?它们之间有什么主要区别?
我: 图可以分为无向图和有向图。无向图中,边没有方向,表示每个顶点之间是双向关系;有向图中,边是有方向的,只能从一个顶点指向另一个顶点。
问题4
GPT: 你提到无向图和有向图,它们在实际应用中有什么具体的例子吗?
我: 在道路网络中,通常可以用无向图来表示,因为道路是双向的。而在计算机网络中,有向图更适合描述数据流动方向。
问题5
GPT: 很好。那么你觉得,在图的数据结构中,使用邻接矩阵和邻接表各有什么优缺点呢?
我: 邻接矩阵适合稠密图,能够快速查询边的联通性,但空间消耗较大。邻接表适合稀疏图,节约空间,但查询边的效率较低。
问题6
GPT: 除了邻接矩阵和邻接表,还有其他表示图的方法吗?你能分析一下它们的优缺点吗?
我: 还有边列表表示法,使用一个列表存储所有的边,每条边包含两个顶点。如果图是稀疏图,边列表可以更加节省空间,但查询某个顶点的连通性会比较慢。
问题7
GPT: 在图的遍历中,你了解深度优先搜索(DFS)和广度优先搜索(BFS)吗?你能描述它们的工作原理吗?
我: DFS尝试尽可能深入每个分支,使用栈数据结构实现,而BFS逐层访问所有相邻的顶点,使用队列数据结构实现。
问题8
GPT: 深度优先搜索和广度优先搜索在实际应用中有什么不同的场景适合使用吗?
我: DFS通常用于寻找路径或解决问题时需要访问整个图的情况,如解决迷宫问题;而BFS适合寻找最短路径,如在地图中找到两个城市之间的最短路线。
问题9
GPT: 对于最短路径算法,你能简单讲讲Dijkstra算法的工作原理吗?
我: Dijkstra算法从起始节点出发,逐步计算到其他节点的最短路径,使用贪心算法的思想,选取当前最近的顶点,不断更新其邻接顶点的路径。
问题10
GPT: 你能解释一下Bellman-Ford算法和Dijkstra算法的主要区别吗?
我: Bellman-Ford算法可以处理负权边,而Dijkstra算法只能处理非负权边。Bellman-Ford算法的时间复杂度更高,但能找到所有顶点的最短路径。
问题11
GPT: 你觉得学习图的基本概念对你以后的编程有帮助吗?为什么?
我: 我觉得学习图的基本概念对编程有很大帮助,因为很多现实世界的问题可以抽象成图模型,比如社交网络、地图导航等,理解图的性质和算法会让我能更好地解决这类问题。
问题12
GPT: 从你对图的理解和应用中,你对图的学习还有什么需要继续深入的领域吗?
我: 我希望进一步了解图的算法优化技术和图在实际应用中的复杂性分析,以便能在遇到大规模图时,选择更合适的算法和数据结构。
最终总结
我: 我的回答结束了,请对我的回答进行评价总结。
GPT: 很好!你对图的基本概念进行了一系列深入的思考,能够清楚地区分不同类型的图和其表示方法,理解图的遍历及最短路径算法。这表明你对图论的基础知识掌握得不错。继续保持这样的探索精神,进一步深入图算法及其应用领域,将对你的编程能力有很大提升。
代码调试中的问题和解决过程
C语言学习中的代码调试问题与解决方案
- 问题1:编写的程序输出结果错误。
- 问题1解决方案:首先检查程序的逻辑是否正确,包括循环条件、判断语句等。然后使用
printf
语句输出中间变量的值,帮助跟踪程序执行过程中的数据流。比如,在处理数组时,如果数组越界,程序会输出错误或者崩溃,确保访问的数组下标在有效范围内。
- 问题1解决方案:首先检查程序的逻辑是否正确,包括循环条件、判断语句等。然后使用
- 问题2:使用
scanf
读取输入时程序崩溃。- 问题2解决方案:确保使用的格式说明符与输入的数据类型匹配。比如,读取整数时应使用
%d
,而读取字符串时需要保证提供的字符数组足够大,并使用%s
格式符。同时,检查scanf
的返回值,判断输入是否成功。
- 问题2解决方案:确保使用的格式说明符与输入的数据类型匹配。比如,读取整数时应使用
- 问题3:动态内存分配后出现内存泄漏。
- 问题3解决方案:跟踪每个
malloc
、calloc
或realloc
调用,确保每次分配的内存都有对应的free
调用在适当的地方释放,避免内存泄漏。定期使用内存分析工具(如valgrind
)进行检查,可以帮助检测未释放的内存块。
- 问题3解决方案:跟踪每个
- 问题4:使用指针时程序崩溃或产生未定义行为。
- 问题4解决方案:确保指针在使用前已被有效初始化,避免使用悬空指针。使用
malloc
分配内存后,确保对应的内存是可用的,并在不需要时释放指针。同时,如果指针指向的局部变量在函数返回后被释放,应避免继续使用。
- 问题4解决方案:确保指针在使用前已被有效初始化,避免使用悬空指针。使用
- 问题5:递归函数导致栈溢出。
- 问题5解决方案:确保递归函数有明确且有效的终止条件,以避免无限递归导致的栈溢出。对于递归深度较大的情况,可以考虑将递归改为迭代实现或优化算法,以减少调用栈的使用。