一、数据结构的概念
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。它不仅仅是存储数据的方式,更强调数据之间的逻辑关系和操作方法。
数据结构主要从以下几个角度来理解:
1. 数据之间的关系
逻辑结构:
集合结构:元素之间没有明显关系。
线性结构:一对一关系(如线性表、栈、队列)。
树形结构:一对多关系(如二叉树、B 树)。
图结构:多对多关系(如社交网络图)。
物理结构:
顺序存储:数据存放在连续的存储空间中(如数组)。
链式存储:数据存放在不连续的存储空间中,通过指针建立关系(如链表)。
2. 算法的概念
算法是对特定问题求解步骤的描述,通常以函数形式实现。它具有以下特性:
输入输出特性:有明确的输入和输出。
可行性:每一步都可实现。
有穷性:在有限步骤后终止。
确定性:同样输入得到唯一输出。
3. 衡量算法优劣的标准
时间复杂度:衡量算法执行所需时间。
常用 大 O 记法:
空间复杂度:衡量算法运行所需的额外存储空间。
二、查找表的存储方式
查找表是一种用于查找、插入、删除数据元素的数据结构。常见的存储方式有:
1. 顺序表
定义:查找表采用顺序存储结构,即数据存储在一片连续的存储空间中。
特征:
支持 随机访问,访问第 i 个元素的时间复杂度为 O(1)。
插入、删除操作需要整体移动,时间复杂度为 O(n)。
不具有动态存储功能,空间固定。
2. 链表
定义:采用链式存储结构,数据元素存储位置不连续,通过指针建立逻辑关系。
特征:
插入、删除操作高效,时间复杂度为 O(1)(前提是已知指针位置)。
查找效率低,不支持随机访问,时间复杂度为 O(n)。
动态存储分配,空间利用率高。
三、顺序表与链表的对比
特征 | 顺序表 | 链表 |
---|---|---|
存储方式 | 连续存储 | 不连续存储 |
访问效率 | O(1)(随机访问) | O(n)(顺序查找) |
插入删除 | O(n)(整体移动) | O(1)(指针操作) |
空间特性 | 固定,可能浪费或溢出 | 动态分配,灵活 |
四、总结与拓展
查找表作为数据结构的核心应用,主要操作包括 查找、插入、删除。
顺序表适用于 查找频繁、插入删除较少的场景,例如字典、静态查找表。
链表适用于 插入删除频繁的动态数据集合,例如任务队列、动态缓存。
在工程实践中,还会发展出 更高效的查找结构:
哈希表(Hash Table):查找平均时间复杂度 O(1)。
平衡树(如 AVL 树、红黑树):查找、插入、删除均为 O(logn)。
跳表(Skip List):结合链表与二分查找思想,支持高效查找。
#ifndef _FINDWORD_H_ // 如果没有定义过_FINDWORD_H_这个宏
#define _FINDWORD_H_ // 则定义它,并编译后续代码
// 头文件内容...
#endif // 结束条件编译
. 核心作用
防止头文件被多次包含导致的重复定义问题。例如:
当多个源文件
#include "findword.h"
时或头文件之间互相嵌套包含时
没有包含保护会导致:
重复的类型定义(编译错误)
重复的函数声明
重复的宏定义