第一单元思维导图
《第一单元思维导图》
一、核心概念与思想
1.1 算法 (Algorithm)
- 定义:解决特定问题的一系列清晰、精确且有限步骤的指令序列。
- 特性:
- 有限性 (Finiteness): 必须在有限步骤内结束。
- 确定性 (Definiteness): 每个步骤都必须明确无歧义。
- 输入 (Input): 具有零个或多个输入。
- 输出 (Output): 产生一个或多个输出。
- 有效性 (Effectiveness): 每个步骤都必须是可行的,能够在有限时间内完成。
- 描述方式:
- 自然语言:简洁易懂,但可能存在歧义。
- 流程图:直观图形化表示,适合描述程序执行流程。
- 伪代码:介于自然语言和编程语言之间,易于理解和转换为代码。
- 程序语言:可以直接执行,但特定于某种编程语言。
1.2 数据结构 (Data Structure)
- 定义:数据元素之间的关系以及这些数据元素在计算机中的存储和组织方式。
- 分类:
- 逻辑结构: 数据元素之间的逻辑关系,独立于计算机。
- 线性结构:线性表、栈、队列、数组。
- 非线性结构:树、图。
- 存储结构: 数据元素在计算机中的实际存储方式。
- 顺序存储:用一组连续的存储单元存储数据元素。
- 链式存储:用任意的存储单元存储数据元素,通过指针建立元素之间的关系。
- 索引存储:在存储数据的同时,建立附加的索引表来加快查找速度。
- 散列存储:根据数据的关键码值计算存储地址。
- 重要性:合理选择数据结构可以提高算法的效率。
1.3 算法分析 (Algorithm Analysis)
- 目的:评估算法的效率,比较不同算法的优劣。
- 内容:
- 时间复杂度 (Time Complexity): 算法执行时间随问题规模增长的趋势。通常使用大O表示法,例如O(1), O(log n), O(n), O(n log n), O(n^2), O(2^n)。
- 空间复杂度 (Space Complexity): 算法执行过程中占用的存储空间随问题规模增长的趋势。同样使用大O表示法。
- 大O表示法:关注算法执行次数的增长率,忽略低阶项和常数项。
- 影响因素:
- 算法的选择。
- 问题的规模。
- 编程语言。
- 硬件环境。
- 最佳情况、最坏情况、平均情况:分别对应算法在不同输入下的效率。
二、线性表 (Linear List)
2.1 定义
- 由n (n >= 0) 个数据元素组成的有限序列。
2.2 顺序表 (Sequential List)
- 存储方式:用一组地址连续的存储单元依次存储线性表的数据元素。
- 优点:
- 缺点:
- 插入和删除操作需要移动大量元素,效率较低。
- 需要预先分配存储空间,可能造成空间浪费。
- 基本操作:
- 插入:在指定位置插入元素。
- 删除:删除指定位置的元素。
- 查找:查找指定值的元素。
2.3 链表 (Linked List)
- 存储方式:用一组任意的存储单元存储线性表的数据元素,通过指针建立元素之间的逻辑关系。
- 分类:
- 单链表:每个节点只有一个指向后继节点的指针。
- 循环链表:最后一个节点指向第一个节点。
- 双向链表:每个节点有两个指针,分别指向前驱节点和后继节点。
- 优点:
- 插入和删除操作方便,不需要移动元素。
- 不需要预先分配存储空间,空间利用率高。
- 缺点:
- 不能随机访问,需要从头开始遍历。
- 需要额外的空间存储指针。
- 基本操作:
- 插入:在指定位置插入节点。
- 删除:删除指定位置的节点。
- 查找:查找指定值的节点。
2.4 顺序表 vs 链表
特性 |
顺序表 |
链表 |
存储方式 |
连续存储单元 |
任意存储单元,通过指针连接 |
随机访问 |
支持 |
不支持 |
插入/删除 |
需要移动大量元素 |
只需要修改指针 |
空间分配 |
需要预先分配空间 |
动态分配空间 |
空间利用率 |
可能存在空间浪费 |
利用率高 |
适用场景 |
频繁访问元素,较少插入/删除操作的场景 |
频繁插入/删除操作,较少访问元素的场景 |
三、案例分析与应用
3.1 学生信息管理系统
- 使用顺序表存储学生信息:适合学生数量变化不大,需要快速查找学生信息的场景。
- 使用链表存储学生信息:适合学生数量变化频繁,需要频繁插入/删除学生信息的场景。
3.2 网页浏览器历史记录
- 使用双向链表存储历史记录:方便用户进行前进和后退操作。
3.3 文本编辑器
- 使用链表存储文本内容:方便在文本中插入和删除字符。
四、总结与展望
- 本单元主要学习了算法、数据结构和算法分析的基本概念,重点掌握了线性表的两种存储结构:顺序表和链表,以及它们各自的优缺点和适用场景。
- 后续学习将在此基础上,深入学习更复杂的数据结构和算法,例如树、图、排序、查找等,并掌握算法设计和分析的技巧,提高解决实际问题的能力。