数据结构经典教程
- 格式:ppt
- 大小:1.56 MB
- 文档页数:93
《数据结构》第五版清华大学自动化系李宛洲2004年5月目录第一章数据结构--概念与基本类型 (6)1.1概述 (6)1.1.1数据结构应用对象 (6)1.1.2学习数据结构的基础 (7)1.1.2.1 C语言中的结构体 (7)1.1.2.2 C语言的指针在数据结构中的关联作用 (8)1.1.2.3 C语言的共用体(union)数据类型 (12)1.1.3数据结构定义 (15)1.2线性表 (17)1.2.1 顺序表 (18)1.2.2 链表 (20)1.2.2.1链表的基本结构及概念 (20)1.2.2.2单链表设计 (22)1.2.2.3单链表操作效率 (29)1.2.2.4双链表设计 (30)1.2.2.5链表深入学习 (32)1.2.2.6稀疏矩阵的三元组与十字链表 (36)1.2.3 堆栈 (41)1.2.3.1堆栈结构 (41)1.2.3.2基本操作 (42)1.2.3.3堆栈与递归 (44)1.2.3.4递归与分治算法 (45)1.2.3.5递归与递推 (49)1.2.3.6栈应用 (52)1.2.4 队列 (57)1.2.4.1队列结构 (57)1.2.3.2队列应用 (59)1.3非线性数据结构--树 (64)1.3.1 概念与术语 (64)1.3.1.1引入非线性数据结构的目的 (64)1.3.1.2树的定义与术语 (65)1.3.1.3树的内部节点与叶子节点存储结构问题 (66)1.3.2 二叉树 (66)1.3.2.1二叉树基本概念 (66)1.3.2.2完全二叉树的顺序存储结构 (68)1.3.2.3二叉树遍历 (69)1.3.2.4二叉树唯一性问题 (71)1.3.3 二叉排序树 (72)1.3.3.1基本概念 (72)1.3.3.2程序设计 (73)1.3.4 穿线二叉树 (79)1.3.4.1二叉树的中序线索化 (80)1.3.4.2中序遍历线索化的二叉树 (81)1.3.5 堆 (82)1.3.5.1建堆过程 (83)1.3.5.2在堆中插入节点 (85)1.3.6 哈夫曼树 (86)1.3.6.1最佳检索树 (86)1.3.6.2哈夫曼树结构与算法 (88)1.3.6.3 哈夫曼树应用 (90)1.3.6.4哈夫曼树程序设计 (92)1.3.7 空间数据结构----二叉树深入学习导读 (95)1.3.7.1k-d树概念 (96)1.3.7.2k-d树程序设计初步 (97)1.4非线性数据结构--图 (100)1.4.1图的基本概念 (100)1.4.2图形结构的物理存储方式 (103)1.4.2.1相邻矩阵 (103)1.4.2.2图的邻接表示 (104)1.4.2.3图的多重邻接表示 (106)1.4.3图形结构的遍历 (107)1.4.4无向连通图的最小生成树(minimum-cost spanning tree:MST) (110)1.4.5有向图的最短路径 (113)1.4.5.1单源最短路径(single-source shortest paths) (113)1.4.5.2每对顶点间最短路经(all-pairs shortest paths) (116)1.4.6拓扑排序 (117)第二章检索 (123)2.1顺序检索 (123)2.2对半检索 (124)2.2.1 对半检索与二叉平衡树 (124)2.2.2对半检索思想在链式存储结构中的应用---跳跃表 (127)2.3分块检索 (133)2.4哈希检索 (134)2.4.1哈希函数 (135)2.4.2闭地址散列 (136)2.4.2.1线性探测法和基本聚集问题 (136)2.4.2.2删除操作造成检索链的中断问题 (138)2.4.2.3随机探测法 (139)2.4.2.4平方探测法 (140)2.4.2.5二次聚集问题与双散列探测方法 (141)2.4.3开地址散列 (142)2.4.4哈希表检索效率 (142)第三章排序 (145)3.1交换排序方法 (145)3.1.1直接插入排序 (145)3.1.2冒泡排序 (147)3.1.3 选择排序 (148)3.1.4 树型选择排序 (149)3.2S HELL排序 (150)3.3快速排序 (152)3.4堆排序 (154)3.5归并排序 (156)3.6数据结构小结 (159)3.6.1 数据结构的基本概念 (159)3.6.2 数据结构分类 (159)3.6.2.1数据结构中的指针问题 (160)3.6.2.2线性表的效率问题 (161)3.6.2.3二叉树 (161)3.6.3排序与检索 (161)3.7算法分析的基本概念 (162)3.7.1基本概念 (162)3.7.2上限分析 (164)3.7.3下限分析 (164)3.7.4空间代价与时间代价转换 (165)第6章高级数据结构内容--索引技术 (167)6.1基本概念 (167)6.2线性索引 (168)6.2.1 线性索引 (168)6.2.2 倒排表 (169)6.32-3树 (170)6.3.1 2-3树定义 (172)6.3.2 2-3树节点插入 (173)6.4B+树 (178)6.4.1 B+树定义 (178)6.4.2 B+树插入与删除 (180)6.4.3 B+树实验设计 (182)第一章数据结构--概念与基本类型1.1概述1.1.1数据结构应用对象计算机应用可以分为两大类,一类是科学计算和工业控制,另一类是商业数据处理。
数据结构教程java语言描述李春葆程序李春葆程序是一种经典的数据结构教程,以Java语言描述。
本文将详细介绍李春葆程序的内容和特点,并分析其对学习数据结构的帮助。
李春葆程序是一本由李春葆编写的数据结构教程,以Java语言描述。
该教程主要介绍了常见的数据结构和算法,包括线性表、栈、队列、树、图等。
通过对这些数据结构的介绍和实现,读者可以深入理解数据结构的原理和应用。
李春葆程序的特点之一是注重理论与实践的结合。
在每个章节中,教程首先介绍了数据结构的基本概念和原理,然后通过具体的Java代码实现来展示这些概念的应用。
这种理论与实践相结合的方式,使得读者可以更加直观地理解数据结构的运作方式,并能够通过实际编程来加深对数据结构的理解。
另一个特点是李春葆程序的编程风格简洁明了。
在代码实现中,作者使用了简洁的Java语法和清晰的注释,使得读者可以轻松理解代码的逻辑和功能。
同时,作者还提供了大量的示例代码和练习题,读者可以通过实际编程来巩固所学的知识。
李春葆程序还注重实际应用和问题解决能力的培养。
在每个章节的最后,作者都提供了一些实际应用的案例,读者可以通过这些案例来了解数据结构在实际问题中的应用。
此外,作者还提供了一些问题解决的思路和方法,读者可以通过这些思路和方法来解决实际问题。
通过学习李春葆程序,读者可以获得以下几方面的收益。
首先,读者可以系统地学习和掌握常见的数据结构和算法。
李春葆程序对各种数据结构的原理和实现进行了详细的介绍,读者可以通过学习这些内容来深入理解数据结构的运作方式和应用场景。
其次,读者可以提高编程能力和问题解决能力。
通过实际编程和解决实际问题的练习,读者可以提高自己的编程技巧和问题解决能力。
同时,通过学习数据结构和算法的思想和方法,读者可以培养自己的抽象思维和逻辑思维能力。
最后,读者可以为进一步学习和研究计算机科学领域打下坚实的基础。
数据结构是计算机科学的基础,掌握了数据结构,读者可以更好地理解和应用其他计算机科学领域的知识,如算法、数据库、操作系统等。
《数据结构》课程教案一、引言数据结构是计算机科学中非常重要的一门课程,它涉及到对数据的组织、存储和访问方法的研究。
数据结构的学习能够帮助学生建立起对计算机中数据处理的基本概念和方法的理解,并培养学生分析和解决实际问题的能力。
本教案旨在为《数据结构》课程提供一套系统的教学计划,以确保学生能够全面掌握该学科的知识和技能。
二、教学目标本课程的主要教学目标如下:1. 掌握常见的数据结构,包括线性表、栈、队列、树、图等,并理解它们的基本概念与特点;2. 理解各种数据结构之间的联系与区别,能够根据问题需求选择合适的数据结构;3. 学习并掌握常用的数据结构算法,如查找、排序等;4. 培养学生分析和解决实际问题的能力,提高编程实践的能力;5. 增强学生的团队合作与沟通能力,通过小组项目实践提升学生能力。
三、教学内容与安排本课程的教学内容将按照以下顺序进行讲解和实践操作:第一章:绪论1. 数据结构的基本概念与作用;2. 学习数据结构的意义与价值;3. 课程的教学方法和学习要求。
第二章:线性表1. 线性表的定义与分类;2. 线性表的顺序存储结构与链式存储结构;3. 线性表的基本运算和实例分析。
第三章:栈与队列1. 栈的定义与基本操作;2. 栈的应用场景与实例分析;3. 队列的定义与基本操作;4. 队列的应用场景与实例分析。
第四章:树与二叉树1. 树的定义与基本术语;2. 二叉树的定义与性质;3. 二叉树的遍历方法与实例分析;4. 哈夫曼树的构建与应用。
第五章:图1. 图的定义与基本术语;2. 图的存储方式与基本操作;3. 图的遍历算法与实例分析;4. 最短路径算法与实例分析。
第六章:查找算法1. 顺序查找与二分查找;2. 哈希查找的原理与实现方法。
第七章:排序算法1. 冒泡排序与插入排序;2. 快速排序与归并排序;3. 堆排序与希尔排序。
第八章:课程总结与展望1. 对整个课程内容的回顾;2. 对数据结构的进一步学习与应用的展望;3. 学生反馈与教师建议。
《数据结构》教案(精华版)《数据结构》教案(精华版)前言数据结构是计算机学科中的重要基础课程,它涉及到数据的存储、组织和管理。
本教案旨在帮助学生掌握数据结构的基本概念、算法和应用,提高其解决实际问题的能力。
第一章:引言在本章中,我们将介绍数据结构的基本概念和重要性。
学生将了解到数据结构在计算机科学中的作用,以及为什么学习数据结构对于他们的职业发展至关重要。
1.1 数据结构的定义数据结构是一种组织和存储数据的方式,它涉及到数据元素之间的关系,以及对这些关系的操作。
1.2 数据结构的分类数据结构可以分为线性结构和非线性结构。
线性结构中的数据元素之间存在一个明确的顺序关系,而非线性结构中的数据元素之间没有固定的顺序关系。
1.3 数据结构的应用数据结构在计算机科学中有广泛的应用。
例如,在数据库管理系统中,数据结构被用来组织和管理大量的数据;在图形图像处理中,数据结构被用来存储和操作图像数据。
第二章:线性结构本章将介绍线性结构,包括线性表、栈和队列。
学生将学习这些线性结构的定义、实现和应用。
2.1 线性表线性表是一种最简单的数据结构,它由一组数据元素组成,这些元素按照线性的顺序存储。
2.2 栈栈是一种特殊的线性表,它具有“先进后出”的特点。
学生将学习栈的定义、实现和常见应用。
2.3 队列队列是另一种特殊的线性表,它具有“先进先出”的特点。
学生将学习队列的定义、实现和应用。
第三章:树结构本章将介绍树结构,包括二叉树、搜索树和平衡树。
学生将学习这些树结构的定义、实现和应用。
3.1 二叉树二叉树是一种常见的树结构,它的每个节点最多有两个子节点。
学生将学习二叉树的定义、实现和遍历算法。
3.2 搜索树搜索树是一种特殊的二叉树,它的每个节点都符合一定的大小关系。
学生将学习搜索树的定义、实现和查找算法。
3.3 平衡树平衡树是一种自平衡的二叉树,它可以保持树的高度平衡。
学生将学习平衡树的定义、实现和平衡算法。
第四章:图结构本章将介绍图结构,包括无向图和有向图。
《数据结构》参考教案数据结构参考教案教案一:数据结构概述1. 介绍数据结构的定义和作用- 数据结构是指组织数据的方式,从而实现高效访问和操作数据的目的。
- 数据结构对于解决实际问题和优化算法具有重要作用。
2. 数据结构的分类- 线性结构:数组、链表、栈、队列等- 非线性结构:树、图等- 文件结构:顺序文件、索引文件等3. 数据结构的基本操作- 插入、删除、查找、排序等操作教案二:线性结构1. 数组- 定义和基本特点- 一维数组和多维数组- 数组的插入、删除、查找操作- 定义和基本特点- 单链表和双链表- 链表的插入、删除、查找操作3. 栈- 定义和基本特点- 栈的应用场景- 栈的插入、删除、查找操作4. 队列- 定义和基本特点- 队列的应用场景- 队列的插入、删除、查找操作教案三:非线性结构1. 树- 二叉树的定义和基本特点- 二叉查找树的构建和操作- 平衡二叉树的原理和应用- 图的定义和基本特点- 图的表示方法:邻接矩阵、邻接表- 图的遍历算法:深度优先搜索、广度优先搜索教案四:文件结构1. 顺序文件- 顺序文件的组织结构- 顺序文件的插入、删除、查找操作2. 索引文件- 索引文件的组织结构- 索引文件的插入、删除、查找操作3. 散列文件- 散列文件的组织结构- 散列文件的插入、删除、查找操作教案五:高级数据结构1. 堆- 堆的定义和基本特点- 最大堆和最小堆- 堆的插入、删除、查找操作2. 并查集- 并查集的定义和基本特点- 并查集的应用场景- 并查集的操作:合并、查找3. Trie树- Trie树的定义和基本特点- Trie树的插入、删除、查找操作教案六:数据结构的应用1. 图的最短路径算法- 迪杰斯特拉算法- 弗洛伊德算法2. 树的应用:哈夫曼编码- 哈夫曼编码的原理和过程- 哈夫曼编码的应用和效果3. 排序算法比较- 冒泡排序、插入排序、选择排序、快速排序、归并排序- 各种排序算法的时间复杂度和稳定性比较教案七:数据结构的优化与扩展1. 动态规划算法- 动态规划的基本思想和适用条件- 应用举例:背包问题、最长公共子序列等2. 基于数据结构的缓存优化- 缓存机制的原理和应用- 基于哈希表和LRU算法实现缓存优化3. 数据结构的持久化存储- 数据结构的序列化和反序列化- 数据结构的存储和恢复教案八:总结与展望1. 数据结构的重要性和应用价值2. 数据结构的学习方法和技巧3. 数据结构的发展趋势和研究方向教案结束。
《深入浅出:Java语言下的数据结构教程》一、引言数据结构是计算机科学的基础,它为我们提供了组织和存储数据的有效方式。
而在Java语言中,李春葆编写的数据结构教程已经成为了许多程序员学习的首选。
本文将深入探讨这一教程的内容,旨在帮助读者更全面、深刻地理解数据结构在Java语言中的应用。
二、数据结构概述数据结构是指在计算机中组织和存储数据的方式,它影响着数据的访问、操作和存储效率。
在Java语言中,我们常用的数据结构包括数组、链表、栈、队列、树和图等。
李春葆的教程就系统地介绍了这些数据结构的原理、实现和应用。
三、数据结构在Java中的应用1. 数组:数组是最简单的数据结构,它可以存储多个相同类型的数据。
在Java中,我们可以通过数组来实现向量、矩阵等数据结构。
2. 链表:链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
在Java中,我们可以通过链表来实现队列、栈等数据结构。
3. 栈和队列:栈和队列是两种基本的数据结构,它们分别采用了后进先出和先进先出的策略。
在Java语言中,我们可以通过数组或链表来实现栈和队列。
4. 树和图:树和图是两种非线性的数据结构,它们在计算机科学中有着广泛的应用。
在Java中,我们可以通过递归或迭代来实现树和图的操作。
四、数据结构的操作和方法1. 增加、删除、查找和遍历:数据结构的基本操作包括增加、删除、查找和遍历。
在Java语言中,我们可以通过各种算法和方法来实现这些基本操作,比如递归、迭代、深度优先搜索和广度优先搜索等。
2. 排序和搜索:排序和搜索是数据结构中常见的问题,它们涉及到了算法和时间复杂度。
在Java语言中,我们通常采用快速排序、归并排序和二分搜索树等方法来实现排序和搜索。
五、个人观点和理解数据结构在Java语言中有着丰富的应用,它为我们提供了高效、灵活和可靠的数据组织和处理方式。
通过学习李春葆的数据结构教程,我们可以更深入地理解数据结构的原理和实现,从而提升自己的编程能力和技术水平。
数据结构教案第七章图第7章图【学习目标】1.领会图的类型定义。
2.熟悉图的各种存储结构及其构造算法,了解各种存储结构的特点及其选用原则。
3.熟练掌握图的两种遍历算法。
4.理解各种图的应用问题的算法.【重点和难点】图的应用极为广泛,而且图的各种应用问题的算法都比较经典,因此本章重点在于理解各种图的算法及其应用场合。
【知识点】图的类型定义、图的存储表示、图的深度优先搜索遍历和图的广度优先搜索遍历、无向网的最小生成树、最短路径、拓扑排序、关键路径【学习指南】离散数学中的图论是专门研究图性质的一个数学分支,但图论注重研究图的纯数学性质,而数据结构中对图的讨论则侧重于在计算机中如何表示图以及如何实现图的操作和应用等.图是较线性表和树更为复杂的数据结构,因此和线性表、树不同,虽然在遍历图的同时可以对顶点或弧进行各种操作,但更多图的应用问题如求最小生成树和最短路径等在图论的研究中都早已有了特定算法,在本章中主要是介绍它们在计算机中的具体实现。
这些算法乍一看都比较难,应多对照具体图例的存储结构进行学习。
而图遍历的两种搜索路径和树遍历的两种搜索路径极为相似,应将两者的算法对照学习以便提高学习的效益。
【课前思考】1。
你有没有发现现在的十字路口的交通灯已从过去的一对改为三对,即每个方向的直行、左拐和右拐能否通行都有相应的交通灯指明。
你能否对某个丁字路口的6条通路画出和第一章绪论中介绍的”五叉路口交通管理示意图”相类似的图?2。
如果每次让三条路同时通行,那么从图看出哪些路可以同时通行?同时可通行的路为:(AB,BC,CA),(AB,BC,BA),(AB,AC,CA),(CB,CA,BC)目录第7章图 (1)7.1图的定义和基本术语 (1)7.2图的存储和创建 (2)7.2.1 图的存储表示 (2)7。
2.2 图的创建 (5)7。
3图的遍历 (5)7。
3.1 深度优先搜索 (5)7.3.2 广度优先搜索 (6)7。
4遍历算法的应用 (8)7.4。
数据结构常用操作数据结构是计算机科学中的关键概念,它是组织和管理数据的方法。
常用的数据结构包括数组、链表、树、图和队列等。
在实际的编程中,我们经常需要对数据结构进行一些操作,如添加、删除和查找等。
以下是一些常用的数据结构操作。
1.添加元素:将新元素插入到数据结构中。
对于数组,可以通过在指定索引位置赋值来添加元素。
对于链表,可以通过创建新节点并调整指针来实现。
对于树和图,可以添加新节点或边来扩展结构。
2.删除元素:从数据结构中移除指定元素。
对于数组,可以通过将元素设置为特定值来删除。
对于链表,可以遍历链表并删除匹配的节点。
对于树和图,可以删除指定节点或边。
3.查找元素:在数据结构中指定元素。
对于有序数组,可以使用二分查找来提高效率。
对于链表,可以遍历链表并比较每个节点的值。
对于树和图,可以使用深度优先(DFS)或广度优先(BFS)等算法进行查找。
4.遍历元素:按照其中一种顺序遍历数据结构中的所有元素。
对于数组和链表,可以使用循环来遍历每个元素。
对于树,可以使用先序、中序或后序遍历来访问每个节点。
对于图,可以使用DFS或BFS来遍历每个节点。
5.排序元素:对数据结构中的元素进行排序。
对于数组,可以使用快速排序、归并排序等常用算法。
对于链表,可以使用插入排序或选择排序等算法。
对于树和图,可以使用DFS或BFS进行遍历并将元素排序。
6.查找最小/最大值:在数据结构中查找最小或最大值。
对于有序数组,最小值在索引0的位置。
对于链表,可以遍历链表并比较每个节点的值。
对于树,可以遍历树的左子树或右子树来找到最小或最大值。
7.合并数据结构:将两个数据结构合并成一个。
对于有序数组,可以先将两个数组合并成一个,然后再排序。
对于链表,可以将一个链表的尾节点连接到另一个链表的头节点。
对于树和图,可以将两个结构合并成一个,保持其关系。
8.拆分数据结构:将一个数据结构拆分成多个。
对于有序数组,可以根据一些值将数组拆分为两个子数组。
(完整版)数据结构教案1. 引言本教案旨在介绍数据结构的基本概念和常用算法,并提供相应的教学资源和活动设计,以帮助学生掌握数据结构的核心知识和能力。
2. 教学目标- 了解数据结构的概念和作用;- 能够使用常见的数据结构(如链表、栈、队列、树、图等)进行问题建模和解决;- 掌握基本的数据结构算法(如排序、查找、遍历等);- 培养学生的编程能力和解决实际问题的能力。
3. 教学内容3.1 数据结构基础- 数据结构的定义和分类;- 数组和链表的比较与应用;- 栈和队列的概念及应用;- 树的基本概念和遍历方法;- 图的基本概念和遍历方法。
3.2 数据结构算法- 排序算法:插入排序、选择排序、冒泡排序、快速排序、归并排序;- 查找算法:顺序查找、二分查找;- 图的最短路径算法:Dijkstra算法、Floyd算法。
4. 教学方法- 讲授理论知识:通过讲解、示意图和实例等形式,向学生介绍数据结构的基本概念和算法;- 编程实践:让学生通过编写程序来实现常见的数据结构和算法,并解决相关问题;- 组织小组讨论和实践活动:让学生合作完成数据结构相关的实际案例分析和解决方案设计。
5. 教学评估为了评价学生的研究效果和能力,我们将采用以下评估方式:- 课堂作业:包括理论题和编程题,用于检查学生对数据结构的理解和应用能力;- 项目实践:学生需要独立或小组完成一个数据结构相关的实际项目,并进行展示和报告;- 期末考试:综合测试学生对数据结构知识的掌握情况。
6. 教学资源为了辅助教学和学生的研究,我们准备了以下教学资源:- 教材:精选的数据结构教材,供学生进行参考和深入研究;- 幻灯片:用于课堂讲解和学生研究的幻灯片,清晰呈现数据结构的概念和算法;- 编程实践指导:提供编程实践的指导和示例代码,帮助学生快速上手;- 练题和答案:提供大量的练题和详细答案,供学生巩固理论知识和算法思维。
7. 教学活动设计为了培养学生的研究兴趣和主动性,我们将设计以下教学活动:- 小组讨论:学生分组进行数据结构相关的主题讨论,分享思路和解决方案;- 编程比赛:组织学生参加数据结构编程比赛,以提高他们的编程能力和算法思维;- 实例分析:选取经典的数据结构实例,引导学生进行分析和实现,加深对数据结构的理解;- 视频讲解:录制有关数据结构的视频讲解,在线平台上供学生随时观看和研究。
湖南涉外经济学院教案学院信息科学与工程学院系/教研室软件工程系课程名称数据结构主讲教师__________ 邹竞 _________湖南涉外经济学院讲授章节第1 2 3 4 5讲绪论授课时数2教学目的:1. 了解数据结构课程的重要性和课程的基本要求,以及本课程涵盖的内容;2. 掌握数据结构的基本概念;3. 理解算法描述和简单的算法分析。
教学内容(讲授提纲)S++;1 从后序课(数据库、操作系统、编译原理、人工智能)的需要和考研两方面介绍数据结构课程的重要性。
2 通过三个例子讲解数据结构研究的内容。
3 介绍基本概念:数据的三个层次,数据结构的三个要素,数据结构的分类,四种存储结构,抽象数据类型,算法,算法的五个特性,对算法设计的要求,算法描述和算法分析,时间复杂度和空间复杂度。
4 从百钱买百鸡”(一百元钱买一百支笔”的算法例子说明选择算法的重要性:方案 1 :for( i = 0; i < =100; i++)for( j = 0; j < =100; j++)for( k= 0; k< =100; k++)if(i+j+k==100 &&3*i+2*j+0.5*k==100) printf( “ i=%dj=%d,k=%d" ,i,j,k) 万案2:for( i = 0; i < =20; i++)for( j = 0; j < =34 -i; j++) if(3*i+2*j+(100 -i-j) *0.5==100) printf( “ i=%d,j=%d,k=%d ” ,i-j-j)P0方案1内层循环超过100万次,在某机器上运行了50分钟;方案2的if语句执行525 次,运行了2秒钟,相差1500倍。
5 算法分析举例(1)常量阶:时间复杂度为O(1)++x;s=0;语句频度为1,时间复杂度为0(1)。
for(j=1;j<=10000;++j) {++x; s+=x;}语句频度为10000 ,时间复杂度为O(1)。