2024-2025-1 20241421 《计算机基础与程序设计》第七周学习总结
作业信息
这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业
这个作业的目标 数组与链表、基于数组和基于链表实现数据结构、无序表与有序表、树、图、子程序与参数
作业正文 https://www.cnblogs.com/118qa/p/18538384
教材学习内容总结
一、数组
定义
一组具有相同数据类型的元素按顺序存储在连续的内存空间中。
特点:
优点:
随机访问效率高。可以通过下标在常数时间内访问到特定位置的元素。
存储效率高,因为内存是连续分配的,CPU 缓存利用率高。
缺点:
插入和删除元素效率低。插入或删除元素可能需要移动大量后续元素,时间复杂度为 O (n)。
大小固定。初始化时需确定数组大小,扩容比较麻烦。
应用场景:
频繁随机访问,且数据量相对固定的情况。例如,存储一组已知数量的学生成绩。
二、链表
定义
由一系列节点组成,每个节点包含数据域和指向下一个节点的指针(对于双向链表还有指向前一个节点的指针)。
特点:
优点:
插入和删除元素效率高。只需修改相关节点的指针,时间复杂度为 O (1)。
大小灵活。可以根据需要动态地增加或减少节点。
缺点:
随机访问效率低。要访问特定位置的元素,需要从头节点开始遍历,时间复杂度为 O (n)。
占用额外的内存空间用于存储指针。
应用场景:
频繁插入和删除元素的情况。例如,实现栈、队列等数据结构。
总之,数组适合随机访问,链表适合频繁的插入和删除操作。在实际应用中,需要根据具体需求选择合适的数据结构。
教材学习中的问题和解决过程
问题:使用链表有什么优缺点?
AI回答:一、优点
动态大小
链表的大小可以根据需要动态地增加或减少。不像数组那样在创建时需要预先确定大小,当数据量不确定或者可能发生较大变化时,链表可以灵活地适应。
例如,在记录用户行为日志的场景中,随着时间的推移,日志数量不断增加,使用链表可以方便地添加新的日志节点,而无需担心预先分配的空间不足。
高效的插入和删除操作
对于链表来说,插入和删除元素的时间复杂度通常为 O (1)。只需要修改相关节点的指针即可完成操作,无需像数组那样移动大量的元素。
比如在实现一个音乐播放列表时,如果需要在播放列表中间插入一首新歌曲或者删除一首正在播放的歌曲,使用链表可以快速地完成这些操作,不会影响其他歌曲在列表中的位置。
二、缺点
随机访问困难
链表不支持随机访问,要访问特定位置的元素,必须从链表的头节点开始逐个遍历,时间复杂度为 O (n)。而数组可以通过下标在常数时间内访问到任意位置的元素。
例如,在需要快速访问第 1000 个元素的场景下,如果使用链表,就需要从头开始遍历 1000 次才能找到目标元素,效率非常低;而数组可以直接通过下标定位到该元素。
额外的内存开销
链表中的每个节点都需要额外的内存空间来存储指向下一个节点的指针(对于双向链表还需要存储指向前一个节点的指针)。这会增加内存的使用量,尤其是当链表长度很长时,内存开销可能会比较大。
假设存储一个整数只需要 4 个字节,而一个链表节点除了存储整数外,还需要额外的 8 个字节来存储指针,那么存储相同数量的整数,链表占用的内存会比数组多。
综上所述,在选择使用链表时,需要根据具体的应用场景权衡其优缺点。如果需要频繁进行插入和删除操作,并且对随机访问的需求不高,那么链表是一个不错的选择;如果需要高效的随机访问,并且数据量相对固定,那么数组可能更适合。
基于AI的学习
请你以数组有关知识点为基础,以苏格拉底的方式向我提问,一次一个问题
数组是一组具有相同数据类型的元素按顺序存储在连续的内存空间中,对吗?
对
数组的随机访问效率高,是因为可以通过下标在常数时间内访问到特定位置的元素,对吗?
对
数组的插入和删除元素效率低,是因为可能需要移动大量后续元素,对吗?
对
数组在初始化时需要确定大小,对吗?
对
数组的内存是连续分配的,这使得 CPU 缓存利用率高,对吗?
对
如果频繁进行插入和删除操作,数组是一个好的选择吗?
是
频繁进行插入和删除操作时,数组可能需要移动大量元素,这还会是一个好的选择吗?
不会
数组适合在什么情况下使用呢?
当需要频繁随机访问元素,并且事先知道数组的大小固定不变时,数组是很合适的选择。因为数组在内存中是连续存储的,可以通过索引快速直接地访问元素。例如存储一组固定数量的学生成绩。
那么在不知道数据量大小的情况下,适合使用数组吗?
不适合
数组的大小固定这个特点,会带来哪些不便呢?
使用前都需要先计算出数据量大小
其他
同志仍需努力!