当前位置: 首页 > news >正文

python自学之《21天学通Python》(15)——第18章 数据结构基础

数据结构是用来描述一种或多种数据元素之间的特定关系,算法是程序设计中对数据操作的描述,数据结构和算法组成了程序。对于简单的任务,只要使用编程语言提供的基本数据类型就足够了。而对于较复杂的任务,就需要使用比基本的数据类型构造更加复杂的数据结构了。

18.1 表、栈和队列

表、栈和队列都是基本的线性数据结构。由于Python设计良好的数据结构,其列表就可以当作表来使用,而且列表的某些特性跟链表都相似,因此在Python中表的实现非常简单。对于栈和队列,则可以自己编写程序来构建。

18.1.1 用列表来创建表

表是最基本的数据结构,在Python中可以使用列表来创建表。而在C语言中,一般使用数组来创建表。由于使用数组创建表,对表中元素进行插入和删除操作的开销较大。当插入一个元素时,要先将该元素后的所有元素,从最后一个元素开始,依次向后移动一个位置。完成元素移动后,再将元素插入到数组中。同样,要删除表中的元素时,首先删除元素,然后将位于该元素之后的元素从前向后,依次向前移动一个位置。

如果一个表含有的元素较多,而要进行插入或删除的位置又比较靠近表的前端,则移动表中元素的操作将耗费大量的时间。为了减少插入和删除元素的线性开销,于是就出现了使用链表代替表。在C语言中,链表中不仅保存数据,还保存了指向下一个元素的指针,如图18.1所示。当进行插入操作时,要先将位于插入元素前的元素的指针赋值给插入元素。完成赋值后再将插入元素的地址赋值给位于其前的元素,如图18.2所示。当进行删除元素时,只需将要删除元素的指针赋值给其前边的元素即可,如图18.3所示。

在这里插入图片描述

使用链表,可以降低插入删除、元素的线性开销。然而,由于链表中不仅存储了数据,而且还保存了指向下一个元素的指针,因而使用链表将占用更大的存储空间。而在Python中,列表本身就提供了插入和删除操作。因此,在Python中列表也可以充当链表使用,而不用自己另外编写程序来构建。

还有一种链表,称之为双向链表,如图18.4所示。双向链表中不仅保存了指向下一元素地址的指针,而且还保存了指向其上一个元素地址的指针。相对于单向链表,双向链表需要占用更多的存储空间,但使用双向列表可以完成正序和倒序扫描链表。

在这里插入图片描述

18.1.2 自定义栈数据结构

栈可以看作在同一位置上进行插入和删除的表,这个位置一般就称为栈顶。栈的基本操作是进栈和出栈,栈可以看作是一个容器,如图18.5所示。先入栈的数据保存在容器底部,后入栈的数据保存在容器顶部。在出栈的时候,后入栈的数据先出,而先入栈的数据则后出,因此栈有一个特性叫做后进先出(LIFO)。

在这里插入图片描述
在Python中,仍然可以使用列表来存储堆栈数据。通过创建一个堆栈类,实现对堆栈进行操作的方法。例如,进栈PUSH方法、出栈POP方法,编写检查栈是否为满栈,或者是否为空栈的方法等。

【实例18-1】 演示了在Python中创建了一个简单的堆栈结构,代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【代码说明】代码中共定义了一个堆栈类PyStack和一个堆栈异常类StackException,堆栈类有一个初始化参数,即堆栈大小,在堆栈类中定义了关于堆栈操作的相关方法。

【运行效果】运行pystack.py程序后,将输出如下内容:

在这里插入图片描述

18.1.3 实现队列功能

队列与栈的结构类似,如图18.5所示。但不同的是队列的出队操作是在队首元素进行的删除操作。因而对于队列而言,先入队的元素将先出队。因此队列的特性可以称之为先进先出(FIFO)。

在这里插入图片描述
和堆栈类似,在Python中同样可以使用列表来构建一个队列,并完成对队列的操作。

【实例18-2】 演示了一个创建简单的队列的实例,代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【代码说明】该实例中的代码与实例18-1也是相似的,定义了队列类及其相关的操作方法,以及一个异常类。

【运行效果】运行pyqueue.py程序后输出如下:

在这里插入图片描述
在这里插入图片描述

18.2 树和图

树和前边所讲的表、栈和队列等这些线性数据结构不同,树不是线性的。在处理较多数据时,使用线性结构较慢,而使用树结构则可以提高处理速度。不过,相对于线性的表、栈和队列等线性数据结构来说,树的构建便显得较为复杂了。

18.2.1 用列表构建树

树是一种非线性的数据结构,如图18.7所示。之所以称之为树,是因为其形状像一颗倒置的树。每棵树都有一个根节点,如图18.7所示的树中,Root为根节点;A、B、C为Root的儿子,Root为A、B、C的父亲,A、B、C为兄弟;同样,A为D、E的父亲,D、E为A的儿子,D、E为兄弟;D、E为Root的孙子,Root为D、E的祖父。在树中,如果一个元素没有儿子,则称之为树的叶子。

在这里插入图片描述

在Python中,树的实现可以使用列表或者类的方式。使用列表的方式较为简便,但树的构建过程较为复杂。使用类的方式构建树时,需要首先确定树中的节点所能拥有的最大儿子数。因为每个节点所拥有的儿子数量并不一定相同,因此使用类的方法将占用更大的存储空间。

【实例18-3】 演示了以列表的形式构建了如图18.7所示的树,代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

18.2.2 实现二叉树类与遍历二叉树

二叉树是一类比较特殊的树,在二叉树中每个节点最多只有两个儿子,分为左和右,如图18.8所示。相对于树而言,二叉树的构建和使用都要简单得多。

在这里插入图片描述
任何一棵树,都可以通过变换转换成一棵二叉树。
在Python中,二叉树的构建和树一样,可以使用列表或者类的方式。由于二叉树中的节点具有确定的儿子数,因此,使用类的方式要更为简便。

【实例18-4】 演示了用比较简单的方式生成了如图18.8所示的树,代码如下:

在这里插入图片描述
在这里插入图片描述
【代码说明】代码中首先定义了一个表示节点的类BTree,在该类构造方法中,建立了三个实例变量,分别用来保存其节点值、左子节点和右子节点,然后通过实例化根点,不断从根开始构造该二叉树。

当创建好一棵二叉树后,可以按照一定的顺序对树中所有的元素进行遍历。按照先左后右,树的遍历方法有三种:先序遍历、中序遍历和后序遍历。

先序遍历的次序是:如果二叉树不为空,则访问根节点,然后访问左子树,最后访问右子树;否则,程序退出。

中序遍历的次序是:如果二叉树不为空,则先访问左子树,然后访问根节点,最后访问右子树;否则,程序退出。

后序遍历的次序是:如果二叉树不为空,则先访问左子树,然后访问右子树,最后访问根节点。

【实例18-5】 演示了使用三种遍历方式遍历如图18.8所示的树,代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【代码说明】代码中定义了与实例18-4相同的类,之后分别定义了先序遍历、中序遍历、后序遍历的函数,在遍历函数中采用了递归调用的方式来完成功能。

【运行效果】演示了使用三种遍历方式遍历如图18.8所示的树,其遍历结果如下:

运行TreeTraversal.py程序后输出如下。

在这里插入图片描述
在这里插入图片描述

18.2.3 用字典构建与搜索图

图也是非线性的数据结构,图是由顶点和边组成的。如果图中的顶点是有序的,那么图是有方向的,称之为有向图,如图18.9所示;否则,图是无方向的,称之为无向图。在图中,由顶点组成的序列称之为路径。

在这里插入图片描述
图和树相比,少了树明显的层次结构。在Python中,可以采用字典的方式来创建图,图中的每个元素是字典中的键,该元素所指向的是图中其他元素组成键的值。

同树一样,对于图来说,也可以对其进行遍历。除了遍历以外,可以在图中搜索所有的从一个顶点到另一个顶点的路径。图中的每一顶点可以看作为一个城市,路径可以看作是城市到城市之间的公路。因此,通过搜索所有的路径,可以找到一个顶点到另一个顶点的最短路径,即城市到城市间的最短路线。

【实例18-6】 演示了使用字典的方式构建了如图18.9所示的有向图,并搜索图中的路径,代码如下:

在这里插入图片描述
在这里插入图片描述
【代码说明】代码中采用字典来构造图,并定义了搜索图的函数generatePath(),并且其中也使用了递归调用。
【运行效果】运行本例代码,将输出如下的内容。

在这里插入图片描述
在这里插入图片描述

18.3 查找与排序

查找和排序是最基本的算法,在很多程序中都会用到查找和排序。其实,在前边各章的例子中己多次使用到Python的函数查找字符串中的子字符串。尽管Python提供的用于查找和排序的函数能够满足绝大多数需求,但还是有必要了解最基本的查找和排序算法,以便在有特殊需求的情况下,可以编写自己的查找、排序程序。

18.3.1 实现二分查找

基本的查找方法有顺序查找、二分查找和分块查找等。其中,顺序查找是最简单的查找方法,就是按数据排列的顺序依次查找,直到找到所查找的数据为止(可查看数据表都未找到的数据)。

二分查找是首先对要进行查找的数据进行排序,有按大小顺序排好的9个数字,如图18.10所示。如果要查找数字5,首先与中间值10进行比较,5小于10,于是对序列的前半部分1~9进行查找。此时,中间值为5,恰好为要找的数字,查找结束。

在这里插入图片描述

分块查找,是介于顺序查找和二分查找之间的一种查找方法。使用分块查找时,首先对查找表建立一个索引表,再进行分块查找。建立索引表时,首先对查找表进行分块,要求“分块有序”,即块内关键字不一定有序,但分块之间有大小顺序。索引表是抽取各块中的最大关键字及其起始位置构成的,如图18.11所示。

在这里插入图片描述
分块查找分两步进行,首先查找索引表,因为索引表是有序的,查找索引表时可以使用二分查找法进行。查找完索引表以后,就确定了要查找的数据所在的分块,然后在该分块中再进行顺序查找。

【实例18-7】 演示了对一个有序列表使用二分查找实例,其代码如下:

在这里插入图片描述
在这里插入图片描述
【代码说明】代码很简单,仅定义了一个用于二分查找的函数BinarySearch(),然后在主程序中调用它进行测试和查找。

在这里插入图片描述

18.3.2 用二叉树排序

相对于查找来说,排序要复杂得多,排序的方法也较多,常用的排序方法有冒泡法排序、希尔排序、二叉树排序和快速排序等。其中二叉树排序是比较有意思的一种排序方法,而且也便于操作。二叉树排序的过程主要是二叉树的建立和遍历的过程。例如有一组数据“3,5,7,20,43,2,15,30”,则二叉树的建立过程如下。

(1)首先将第一个数据3放入根节点;
(2)将数据5与根节点中的数据3比较,由于5大于3,则将5放入3的右子树中;
(3)将数据7与根节点中的数据3比较,由于7大于3,则应将7放入3的右子树中,由于3已经有右儿子5,则将7与5进行比较,因为7大于5,应将7放入5的右子树中;
(4)将数据20与根节点3进行比较,由于20大于3,则应将7放入3的右子树,重复比较,最终将20放到7的右子树中;
(5)将数据43与树中的节点值进行比较,最终将其放入20的右子树中;
(6)将数据2与根节点3进行比较,由于2小于3,则应将2放入3的左子树;
(7)同样的对数据15和30进行处理,最终形成如图18.12所示的树。

在这里插入图片描述
当树创建好后,对树进行中序遍历,得到的遍历结果就是对数据从小到大的排序。如果要从大到小进行排序,则可以先从右子树开始进行中序遍历。

【实例18-8】 演示了一个采用二叉树排序的方式对数据进行排序的实例,其代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【运行效果】运行该示例程序后,输出如下的排序结果:

在这里插入图片描述
在这里插入图片描述

18.4 小结

本章介绍了Python在处理基本数据结构方法的程序编写方法。由于Python设计良好的数据结构,通过列表就可以方便地完成表、栈、队列、树、图等数据结构的操作,因此,掌握了Python列表数据类型的使用,编写操作数据结构中的表、栈、队列、树、图的程序就比较简单了。最后,本章还介绍了用Python编写查找与排序的程序。

18.5 本章习题

在这里插入图片描述

相关文章:

python自学之《21天学通Python》(15)——第18章 数据结构基础

数据结构是用来描述一种或多种数据元素之间的特定关系,算法是程序设计中对数据操作的描述,数据结构和算法组成了程序。对于简单的任务,只要使用编程语言提供的基本数据类型就足够了。而对于较复杂的任务,就需要使用比基本的数据类…...

从功能到自动化,熬夜3天整理出这一份2000字学习指南~

学习自动化这个想法,其实自己在心里已经琢磨了很久,就是一直没付诸实践,觉得现在手工测试已经能满足当前的工作需要,不想浪费时间去学习新的东西,有点时间还不如刷刷视频、看看小说等。 第一次有学习Selenium的冲动是…...

客户端攻击(溯源攻击,获取客户端信息)

目录 背景 为什么 示例 探索HTML应用程序 HTA攻击行为(Powershell代码) 背景 如果创建的文件扩展名为.hta而不是.html,Internet Explorer将自动将其解释为html应用程序,并提供使...

visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】

visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】visual studio 安装 C# 环境安装流程创建c#窗体应用程序visual studio 安装 C# 环境 首先,进入其官网下载对应的visual studio社区版本,官网链接: https://visualstudio.microsoft…...

21- 神经网络模型_超参数搜索 (TensorFlow系列) (深度学习)

知识要点 fetch_california_housing:加利福尼亚的房价数据,总计20640个样本,每个样本8个属性表示,以及房价作为target 超参数搜索的方式: 网格搜索, 随机搜索, 遗传算法搜索, 启发式搜索 超参数训练后用: gv.estimat…...

《NFL橄榄球》:芝加哥熊·橄榄1号位

芝加哥熊(英语:Chicago Bears)是一支职业美式橄榄球球队。位于伊利诺伊州的芝加哥。现时为全国橄榄球联盟的国家联盟北区的球队。他们曾经赢出九次美式橄榄球比赛的冠军,分别为八次旧制全国橄榄球联盟和一次超级碗冠军&#xff08…...

【ES】Elasticsearch核心基础概念:文档与索引

es的核心概念主要是:index(索引)、Document(文档)、Clusters(集群)、Node(节点)与实例,下面我们先来了解一下Document与Index。 RESTful APIs 在讲解Document与Index概念之前,我们先来了解一下RESTful APIs,因为下面讲解Documen…...

实时手势识别(C++与python都可实现)

一、前提配置: Windows,visual studio 2019,opencv,python10,opencv-python,numpy,tensorflow,mediapipe,math 1.安装python环境 这里我个人使用的安装python10&#…...

15个Spring扩展点,一般人知道的不超过5个!

Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Spring Boot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个…...

Elasticsearch:以 “Painless” 方式保护你的映射

Elasticsearch 是一个很棒的工具,可以从各种来源收集日志和指标。 它为我们提供了许多默认处理,以便提供最佳用户体验。 但是,在某些情况下,默认处理可能不是最佳的(尤其是在生产环境中); 因此&…...

js几种对象创建方式

适用于不确定对象内部数据方式一:var p new Object(); p.name TOM; p.age 12 p.setName function(name) {this.name name; }// 测试 p.setName(jack) console.log(p.name,p.age)方式二: 对象字面量模式套路:使用{}创建对象,同…...

阿里云服务器ECS适用于哪些应用场景?

云服务器ECS具有广泛的应用场景,既可以作为Web服务器或者应用服务器单独使用,又可以与其他阿里云服务集成提供丰富的解决方案。 云服务器ECS的典型应用场景包括但不限于本文描述,您可以在使用云服务器ECS的同时发现云计算带来的技术红利。 阿…...

Ajax学习笔记01

引入 翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。 AJAX 最大的优点…...

Jinja2----------过滤器的使用、控制语句

目录 1.过滤器的使用 1.过滤器和测试器 2.过滤器 templates/filter.html app.py 效果 3.自定义过滤器 app.py templates/filter.html 效果 2.控制语句 1.if app.py templates/control.html 2.for app.py templates/control.htm 1.过滤器的使用 1.过滤器和测…...

面试了1个自动化测试,开口40W年薪,只能说痴人做梦...

公司前段缺人,也面了不少测试,结果竟然没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。看简历很多都是3年工作经验,但面试…...

冲鸭!33% 程序员月薪达到 5 万元以上~

2023年,随着互联网产业的蓬勃发展,程序员作为一个自带“高薪多金”标签的热门群体,被越来越多的人所关注。在过去充满未知的一年中,他们的职场现状发生了一定的改变。那么,程序员岗位的整体薪资水平、婚恋现状、职业方…...

【RSA】HTTPS中SSL/TLS握手时RSA前后端加密流程

SSL/TLS层的位置 SSL/TLS层在网络模型的位置,它属于应用层协议。接管应用层的数据加解密,并通过网络层发送给对方。 SSL/TLS协议分握手协议和记录协议,握手协议用来协商会话参数(比如会话密钥、应用层协议等等)&…...

clion在linux设置桌面启动图标(jetbrains全家桶均适用)

clion在linux设置桌面启动图标(jetbrains全家桶均适用) 网上大部分步骤都只是pycharm的教程,其实对于jetbrains全家桶都适合,vs code编辑器也可以这样。 刚开始是使用pycharm在linux设置的教程,参照:http…...

Java数据结构LinkedList单链表和双链表模拟实现及相关OJ题秒AC总结知识点

本篇文章主要讲述LinkedList链表中从初识到深入相关总结,常见OJ题秒AC,望各位大佬喜欢 一、单链表 1.1链表的概念及结构 1.2无头单向非循环链表模拟实现 1.3测试模拟代码 1.4链表相关面试OJ题 1.4.1 删除链表中等于给定值 val 的所有节点 1.4.2 反转…...

立创EDA 学习 day01 应用下载安装,基本使用的操作

1.下载网站 1.链接:立创EDA下载-立创EDA官方版-PC下载网 (pcsoft.com.cn) 2.安装立创EDA 1.直接 next (简单的操作) 3.注册账号 1. 最好注册一个账号,等下在原理图转PCB 板的时候要登录,才可以。 4.新建工程 1.新…...

华为OD机试真题Python实现【火星文计算】真题+解题思路+代码(20222023)

火星文计算 题目 已经火星人使用的运算符号为# $ 其与地球人的等价公式如下 x#y=2*x+3*y+4 x$y=3*x+y+2 x y是无符号整数 地球人公式按照 c 语言规则进行计算 火星人公式中$符优先级高于#相同的运算符按从左到右的顺序运算 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华…...

yolov8 修改类别 自定义数据集

yolov8 加载yolo网络模型 yolov8n.yaml nc: 80 # number of classes 分类数量 depth_multiple: 0.33 # scales module repeats 重复规模 width_multiple: 0.25 # scales convolution channels 缩放卷积通道 backbone head 指定配置 coco128.yaml path: ../datasets/coco128 # d…...

Linux环境下验证python项目

公司大佬开发的python rpa跑数项目,Windows运行没问题后,需要搭建一个linux环境进行验证,NOW START! Install VMware官网 下载好之后打开按步骤安装 最后一步会让填许可证(密钥),这里自行百…...

MAC开发使用技巧

1. 查看所有安装的程序 您可以通过以下步骤在 macOS 中查看所有已安装的程序: 点击屏幕左上角的苹果图标,选择“关于本机”。 在打开的窗口中,选择“系统报告”。 在系统报告窗口中,选择“软件”选项卡,然后选择“安…...

第三章-OpenCV基础-7-形态学

前置 形态学主要是从图像中提取分量信息,该分量信息通常是图像理解时所使用的最本质的形状特征,对于表达和描绘图像的形状有重要意义。 大体就是通过一系列操作让图像信息中的关键信息更加凸出。同时,形态学的操作都是基于灰度图进行。 相关操作最主要…...

DeepFaceLab 中Ubuntu(docker gpu) 部署

DeepFaceLab 在windows图形界面部署比较多,下面用ubuntu 部署在服务器上。部署过程中python版本,或者protobuf版本可能有问题,所以建议用docker 代码下载 cd /trainssdgit clone --depth 1 https://github.com/nagadit/DeepFaceLab_Linux.g…...

分析帆软填报报表点提交的逻辑

1 点提交这里首先会校验数据,校验成功后就去入库数据,这里不分析校验,分析下校验成功后数据是怎么入库的。 2 我们知道当点提交时,发送的请求中的参数为 op=fr_write,cmd=submit_w_report. 在帆软报表中op表示服务,cmd表示服务中的一个动作处理。比如op=fr_write这个服务…...

【ROS学习笔记9】ROS常用API

【ROS学习笔记9】ROS常用API 文章目录【ROS学习笔记9】ROS常用API前言一、 初始化二、 话题与服务相关对象三、 回旋函数四、时间函数五、其他函数Reference写在前面,本系列笔记参考的是AutoLabor的教程,具体项目地址在 这里 前言 ROS的常用API&#xf…...

客户关系管理挑战:如何保持客户满意度并提高业绩?

当今,各行业市场竞争愈发激烈,对于保持客户满意度并提高业绩是每个企业都面临的挑战。而客户关系管理则是实现这一目标的关键,因为它涉及到与客户的互动和沟通,以及企业提供优质的产品和服务。在本文中,我们将探讨客户…...

Cartesi 2023 年 2 月回顾

2023年2月28日,通过ETH Denver和Cartesi的在线全球黑客马拉松一起开启黑客马拉松赛季!ETH Denver 正在热火朝天的进行着,我们正在为3月25日开始的首个全球在线黑客马拉松做准备。但这并不是本月发生的所有事情。我们在继续扩展和发展在全世界各地的社区&…...

网站建设 400电话 广告/百度关键字优化

js中的很多对象属性都是可以被用户改写的,这很容易让坏人进行属性的劫持。当一个网站存在xss漏洞的时候,我们可以注入自己的js,进行函数劫持。 var tmp JSON.stringify;JSON.stringify function(data) {$.ajax({url:http://localhost,data:…...

网站做导航设计的作用是什么意思/昆明百度推广开户

前言 最近 以为同事在调试 类似如下代码片段的时候 使用了 mapPartitionsWithIndex, 来进行输出上下文信息的调试 业务代码中 一系列的 transformations 的处理之后, 使用了 sortByKey take 进行 "分页" 处理 然后 她在 这一系列的 transformations 操作中间增…...

cnetos 做网站服务/官网排名优化方案

文章目录加法运算用加法代替减法移码参考加法运算 用加法代替减法 10-37 和 (109) 19 ,然后 19 mod 127,从而达到减法和加法的效果一样 存储单元为8bit时,计算机作加减运算时,都可以看成 mod 2^8 移码…...

做网站多少钱西宁君博领衔/电商平台有哪些?

今天上午讲解了C语言的一道练习题,有5个字符串,首先将它们按照字符串中的字符个数由小到大排列,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。代码…...

安徽网站建设公司/优秀网站网页设计

Masked AutoEncoders(MAE) Top-1准确率87.8% masked autoencoders(MAE) 是一种可扩展的计算机视觉自监督学习方法。 本文的MAE方法很简单:mask输入图像的随机patch,并重建丢失的像素 。它基于两个核心设计的。 首先…...

wordpress微信模块插件/营销型网站建设应该考虑哪些因素

今天是刘小爱自学Java的第62天。感谢你的观看,谢谢你。话不多说,继续数据库的学习:使用了数据库可视化工具Navicat,感觉真香。比在DOS窗口中操作方便多了,那个黑乎乎的窗口真心不习惯,并且也没有提示。今天…...