第9章 贪心法

合集下载

算法与生活 教案

算法与生活  教案

算法与生活教案章节一:引言教学目标:1. 让学生了解算法在生活中的重要性。

2. 培养学生对算法的兴趣和好奇心。

教学内容:1. 介绍算法的定义和特点。

2. 举例说明算法在生活中的应用。

教学步骤:1. 引入话题:讨论日常生活中遇到的问题,如排序、查找等。

2. 介绍算法的定义:算法是解决问题的一系列步骤。

3. 讲解算法的特点:有穷性、确定性、可行性。

4. 举例说明算法在生活中的应用:地图导航、购物网站推荐等。

章节二:排序算法教学目标:1. 让学生了解排序算法的概念和作用。

2. 培养学生掌握排序算法的应用。

教学内容:1. 介绍排序算法的定义和分类。

2. 讲解冒泡排序算法的基本思想和步骤。

3. 分析冒泡排序算法的优缺点。

教学步骤:1. 引入话题:讨论日常生活中遇到的排序问题。

2. 介绍排序算法的定义:将一组数据按照特定顺序排列的算法。

3. 讲解冒泡排序算法:比较相邻元素,交换位置,重复执行直到排序完成。

4. 演示冒泡排序算法的实现。

5. 分析冒泡排序算法的优缺点:简单易懂,但效率较低。

章节三:查找算法教学目标:1. 让学生了解查找算法的概念和作用。

2. 培养学生掌握查找算法的应用。

教学内容:1. 介绍查找算法的定义和分类。

2. 讲解线性查找算法的基本思想和步骤。

3. 分析线性查找算法的优缺点。

教学步骤:1. 引入话题:讨论日常生活中遇到的查找问题。

2. 介绍查找算法的定义:在一组数据中查找特定元素的过程。

3. 讲解线性查找算法:从数据的一端开始,逐个比较直到找到或遍历完。

4. 演示线性查找算法的实现。

5. 分析线性查找算法的优缺点:简单易懂,但效率较低。

章节四:递归算法教学目标:1. 让学生了解递归算法的概念和特点。

2. 培养学生掌握递归算法的应用。

教学内容:1. 介绍递归算法的定义和特点。

2. 讲解递归算法的实现和应用。

3. 分析递归算法的优缺点。

教学步骤:1. 引入话题:讨论日常生活中遇到的可以分解为更小问题的问题。

信息学-骗分导论

信息学-骗分导论

新版骗分导论THE NEW GUIDE OF CHEATING IN INFORMATICS OLYMPIAD目录第1章绪论第2章从无解出发2.1 无解情况2.2 样例——白送的分数第3章“艰苦朴素永不忘”3.1 模拟3.2 万能钥匙——DFS第4章骗分的关键——猜想4.1 听天由命4.2 猜测答案4.3 寻找规律4.4 小数据杀手——打表第5章做贪心的人5.1 贪心的算法5.2 贪心地得分第6章C++的福利6.1 快速排序6.2 “如意金箍棒”第7章“宁为玉碎,不为瓦全”第8章实战演练第9章结语第1章绪论在Oier中,有一句话广为流传:任何蒟蒻必须经过大量的刷题练习才能成为大牛乃至于神牛。

这就是著名的lzn定理。

然而,我们这些蒟蒻们,没有经过那么多历练,却要和大牛们同场竞技,我们该怎么以弱胜强呢?答案就是:骗分那么,骗分是什么呢?骗分就是用简单的程序(比标准算法简单很多,保证蒟蒻能轻松搞定的程序),尽可能多得骗取分数。

让我们走进这本《新版骗分导论》,来学习骗分的技巧,来挑战神牛吧!第2章从无解出发2.1 无解情况在很多题目中都有这句话:“若无解,请输出-1.”看到这句话时,骗分的蒟蒻们就欣喜若狂,因为——数据中必定会有无解的情况!那么,只要打出下面这个程序:printf(“-1”);就能得到10分,甚至20分,30分!举个例子:NOIP2012第4题,文化之旅题目描述Description有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。

不同的国家可能有相同的文化。

不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。

现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。

第九章-数据结构与算法基础

第九章-数据结构与算法基础

解题思路多代入法二叉树度叶子结点就是没有孩子的结点,其度为0,度为二的结点是指有两个子数的结点。

注意树的度和图的度区别叶子结点二叉排序树完全二叉树若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树。

完全二叉树——只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树;最优二叉树(就是哈弗曼树)平衡二叉树平衡二叉树,又称AVL树。

它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差之差的绝对值不超过1.。

满二叉树满二叉树——除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树,。

除最后一层无任何子节点外,每一层上的所有结点都有两个子结点(最后一层上的无子结点的结点为叶子结点)。

也可以这样理解,除叶子结点外的所有结点均有两个子结点。

节点数达到最大值。

所有叶子结点必须在同一层上.本题主要考查一些特殊二叉树的性质。

若二叉树中最多只有最下面两层的结点度数可以小于2,并且最下面一层的叶子结点都依次排列在该层最左边的位置上,则这样的二叉树称为完全二叉树,因此在完全二叉树中,任意一个结点的左、右子树的高度之差的绝对值不超过1。

二叉排序树的递归定义如下:二叉排序树或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于根结点的值;(3)左右子树也都是二叉排序树。

在n个结点的二叉树链式存储中存在n+1个空指针,造成了巨大的空间浪费,为了充分利用存储资源,可以将这些空链域存放指向结点在遍历过程中的直接前驱或直接后继的指针,这种空链域就称为线索,含有线索的二叉树就是线索二叉树。

最优二叉树即哈夫曼树。

排序各种排序的大致思路?各种排序适用于什么情况?各种排序的时间,空间复杂度?快速排序1.快速排序(Quicksort)是对冒泡排序法的一种改进,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列;在对一个基本有序的数组进行排序时适合采用快速排序法。

算法分析与设计概论

算法分析与设计概论

9
How to Study Algorithm?
“Sometimes we have experiences, and sometimes not. Therefore, the better way is to learn more."
10
1.1 算法与程序
算法:是满足下述性质的指令序列。
输 入:有零个或多个外部量作为算法的输入。 输 出:算法产生至少一个量作为输出。 确定性:组成算法的每条指令清晰、无歧义。 有限性:算法中每条指令的执行次数有限,执行 每条指令的时间也有限。
1) 第一种解法:
输入:所购买的三种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[ ],m[ ],s[ ] 1. void chicken_question(int n,int &k,int g[ ],int m[ ],int s[ ]) 2. { int a,b,c; 4. k = 0; 5. for (a=0;a<=n;a++) 6. for (b=0;b<=n;b++) 7. for (c=0;c<=n;c++) { 8. if ((a+b+c==n)&&(5*a+3*b+c/3==n)&&(c%3==0)) { 9. g[k] = a; 10. m[k] = b; 11. s[k] = c; 12. k++; 13. }}}
矩阵。
数组 T:表示售货员的路线,依次存放旅行路线中的城 市编号。
售货员的每一条路线,对应于城市编号的一个排列。
n 个城市共有 n! 个排列,采用穷举法逐一计算每一条路线的费 用,从中找出费用最小的路线,便可求出问题的解。

陈嫒算法与数据结构第三版课后答案

陈嫒算法与数据结构第三版课后答案

陈嫒算法与数据结构第三版课后答案算法与数据结构-C语言描述(第三版)第1章绪论1、解释以下概念:逻辑结构,存储结构,操作,数据结构,数据结构的表示,数据结构的实现,抽象数据类型,算法,算法的时间代价,算法的空间代价,大O表示法,贪心法,回溯法,分治法。

答:(1)逻辑结构(数学模型):指数据元素之间地逻辑关系。

具体解释:指数学模型(集合,表,树,和图)之间的关系。

描述方式:B=<K,R>,K是节点的有穷集合,R是K上的一个关系。

(2)存储结构(物理结构):数据的逻辑结构在计算机存储器中的映射(或表示)。

(3)操作(行为):指抽象数据类型关心的的各种行为在不同的存储结构上的具体算法(或程序)。

(4)数据结构:传统观念:数据结构是计算机中表示(存储)的、具有一定逻辑关系和行为特征的一组数据。

②根据面向对象的观点:数据结构是抽象数据类型的物理实现。

(5)数据结构的表示:(6)数据结构的实现:(7)抽象数据类型:(8)算法:是由有穷规则构成(为解决其中一类问题)的运算序列。

-算法可以有若干输入(初始值或条件)。

-算法通常又有若干个输出(计算结果)。

-算法应该具有有穷性。

一个算法必须在执行了有穷步之后结束。

-算法应该具有确定性。

算法的每一步,必须有确切的定义。

-算法应该有可行性。

算法中国的每个动作,原则上都是能够有机器或人准确完成的。

(9)算法的时间代价:(10)算法的空间代价:(11)大O表示法:-更关注算法复杂性的量级。

-若存在正常数c和n0,当问题的规模n>=cf(n), 则说改算法的时间(或空间)代价为O(f(n))(12)贪心法:当追求的目标是一个问题的最优解是,设法把整个问题的求解工作分成若干步来完成。

在其中的每一个阶段都选择都选择从局部来看是最优的方案,以期望通过各个阶段的局部最有选择达到整体的最优。

例如:着色问题:先用一种颜色尽可能多的节点上色,然后用另一种颜色在为着色节点中尽可能多的节点上色,如此反复直到所有节点都着色为止;(13)回溯法有一些问题,需要通过彻底搜索所有的情况寻找一个满足一些预定条件的最优解。

蚁群优化算法

蚁群优化算法
规则虽然简单,但在地点数目增多后求解却极为复杂。以42个地点 为例,如果要列举所有路径后再确定最佳行程,那么总路径数量之 大,几乎难以计算出来。 多年来全球数学家绞尽 脑汁,试图找到一个高 效的算法。 TSP问题在物流中的描 述是对应一个物流配送 公司,欲将n个客户的 订货沿最短路线全部送 到。如何确定最短路线。
第9章 智能优化方法
Contents
1 2
遗传算法
蚁群优化算法 粒子群优化算法
3
蚁群优化算法
先看1个最优化例子
“旅行商问题”(Travel Salesman Problem, TSP 问题)常被称为“旅行推销员问题”,是指一名推销员要 拜访多个地点时,如何找到在拜访每个地点一次后再回到 起点的最短路径。
k 1 m
5.2 算法流程
路径构建 信息素更新
5.2 算法流程
例5.1 给出用蚁群算法求解一个四城市的TSP问题的执 行步骤,四个城市A、B、C、D之间的距离矩阵如下
3 1 2 3 5 4 W dij 1 5 2 2 4 2
假设蚂蚁种群的规模m=3,参数=1,=2,r=0.5。
5.2 算法流程
信息素更新
(1)在算法初始化时,问题空间中所有的边上的信息素都被初始 化为0。 (2)算法迭代每一轮,问题空间中的所有路径上的信息素都会发 生蒸发,我们为所有边上的信息素乘上一个小于1的常数。信息素 蒸发是自然界本身固有的特征,在算法中能够帮助避免信息素的 无限积累,使得算法可以快速丢弃之前构建过的较差的路径。 (3)蚂蚁根据自己构建的路径长度在它们本轮经过的边上释放信 息素。蚂蚁构建的路径越短、释放的信息素就越多。一条边被蚂 蚁爬过的次数越多、它所获得的信息素也越多。 (4)迭代(2),直至算法终止。

数据结构大纲

数据结构大纲

1. 关于算法:(1)算法语言无所谓,只要能看懂。

考试用C++出题,但答题随意(可以用C/C++、Java、Pascal、自然语言等等,看得懂就可以)。

(2)如果要求自己独立地写算法(而不是填空),请注意写算法思想,并加上足够的注释(3)对于算法中直接使用的类和函数(例如栈、队列的函数),应该先写ADT,并说明函数功能、入口参数、出口参数2. 考试范围和重点不考11.3存储管理,不考12.3空间树结构,不考12.4.1决策树、12.4.2博弈树。

各章节以下面的内容为复习重点,尤其是___________、黑体字或★标出部分为重中之重。

其中黑体字为根据新教材本届考试增加的内容。

考试时如果涉及到本大纲没有列出的内容,那么试卷中会给出足够的定义和性质。

第1章概论(教材中本章作者为许卓群)一. 重要概念1. 数据类型2. 抽象数据结构3. 数据结构4. 存储结构5. 算法6. 算法度量(时间代价、空间代价)7. 数据结构的选择和评价二. 方法1. 根据二元组画出图示逻辑结构(注意边的方向)2. 根据要求设计数据结构3. 算法度量的大O表示法的简化法则(不要求掌握大Ω、大Θ表示法)第2章线性表(教材中本章作者为许卓群)一. 概念1. 线性表2. 单链表3. 双链表4. 循环表5. 栈6. 队列7. 循环队列二. 方法1. 线性表的运算(指针操作的正确性)2. 循环队列队列的实现★3. 表达式求值(中缀表达式转后缀表达式的算法、后缀表达式求值算法)4. 栈的性质,用栈来生成序列第3章字符串(教材中本章作者为许卓群)一. 概念1. 串2. 模式匹配二. 方法1. 串的基本操作2. 串的存储★ 3. 串的KMP快速模式匹配算法(next数组),求特征next数组(N数组)和利用next数组完成匹配的方法第4章二叉树(教材中本章作者为杨冬青)一. 概念1. 二叉树2.二叉树的前序、中序、后序周游3. 二叉排序树4. 穿线树(中序、前序、后序)5. Huffman树、Huffman编码6. 堆、堆排序二. 方法1.二叉树的链式存储(1)二叉链表(2)带父指针的三重链表2. 二叉树的顺序存储完全二叉树的顺序存储★3. 使用栈(前、中、后序)周游二叉树(注意,不要使用带GOTO语句的机械消除递归的方法)、使用队列层次地周游二叉树,在周游过程中寻找某个结点或进行某种操作 (结合应用,例如穿线树,或把快速排序转换成非递归形式)4. 二叉检索树的插入与删除5. 构造Huffman树,利用Huffman树进行编码、解码6. 堆排序的建堆过程第5章树(教材中本章作者为杨冬青)一. 概念1. 树、森林2. 树、森林的先根周游、后根周游、层次周游二. 方法1. 树林与二叉树相互转换2.森林的链式存储(1) 转换为相应的二叉树,用二叉链表表示(2) 父指针表示法(3) 子结点表表示法3. 森林的顺序存储不必死记各种顺序存储方法,要了解原理。

2020知到(智慧树)《人工智能基础导学》章节测试答案最新改版

2020知到(智慧树)《人工智能基础导学》章节测试答案最新改版

2020知到(智慧树)《人工智能基础导学》章节单元测试答案绪论单元测试•第1部分•总题数: 101.【单选题】 (10分)1956年达特茅斯会议上,学者们首次提出“artificial intelligence(人工智能)”这个概念时,所确定的人工智能研究方向不包括:A.研究如何用计算机来模拟人类智能B.研究智能学习的机制C.研究人类大脑结构和智能起源D.研究如何用计算机表示人类知识2.【单选题】 (10分)在现阶段,下列哪项尚未成为人工智能研究的主要方向和目标:A.研究如何用计算机模拟人类智能的若干功能,如会听、会看、会说B.研究如何用计算机延伸和扩展人类智能C.研究机器智能与人类智能的本质差别D.研究如何用计算机模拟人类大脑的网络结构和部分功能3.【单选题】 (10分)下面哪个不是人工智能的主要研究流派?A.模拟主义B.经验主义C.连接主义D.符号主义4.【单选题】 (10分)从人工智能研究流派来看,西蒙和纽厄尔提出的“逻辑理论家”方法用,应当属于:A.连接主义,经验主义B.经验主义,行为主义C.符号主义,连接主义D.理性主义,符号主义5.【单选题】 (10分)从人工智能研究流派来看,明斯基等人所推荐的“人工神经网络”方法用计算机模拟神经元及其连接,实现自主识别、判断,应当属于:A.符号主义,连接主义B.连接主义,经验主义C.理性主义,符号主义D.经验主义,行为主义6【判断题】 (10分)“鸟飞派”指的是人类研究人工智能必须要完全符合智能现象的本质A.错B.对7【判断题】 (10分)人工智能受到越来越多的关注,许多国家出台了支持人工智能发展的战略计划A.错B.对8【判断题】 (10分)人工智能将脱离人类控制,并最终毁灭人类A.错B.对9【判断题】 (10分)人工智能目前仅适用于特定的、专用的问题A.错B.对10【判断题】 (10分)通用人工智能的发展正处于起步阶段A.错B.对第一章单元测试•第1部分•总题数: 101.【单选题】 (10分)以下组合最能全面包括所有知识表示形式的是A.符号主义、经验主义、连接主义B.符号主义、特征表示、语义向量C.产生式系统、特征表示、连接主义D.谓词逻辑、经验主义、网络权重2.【单选题】 (10分)以下用谓词表示的命题错误的是A.大亮的老师擅长打羽毛球和网球:good_at(teacher(大亮),羽毛球)⋀ good_at(teacher(大亮),网球)B.我爸爸喜欢吃鸡蛋并且我妈妈喜欢吃西红柿:like_eat(father(我),鸡蛋) ∨like_eat(moth er(我),西红柿)C.小博不在实验室:¬in(小博,实验室)D.老王的生日在4月:birthday(老王,4月)3.【单选题】 (10分)哪种知识表示的样本数据的特征表示,就对应了某种知识。

《算法分析与设计》(李春葆版)课后选择题答案与解析

《算法分析与设计》(李春葆版)课后选择题答案与解析

《算法及其分析》课后选择题答案及详解第1 章——概论1.下列关于算法的说法中正确的有()。

Ⅰ.求解某一类问题的算法是唯一的Ⅱ.算法必须在有限步操作之后停止Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊Ⅳ.算法执行后一定产生确定的结果A.1个B.2个C.3个D.4个2.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是()。

A.T(n)=T(n-1)+1,T(1)=1B.T(n)=2nC.T(n)= T(n/2)+1,T(1)=1D.T(n)=3nlog2n答案解析:1.答:由于算法具有有穷性、确定性和输出性,因而Ⅱ、Ⅲ、Ⅳ正确,而解决某一类问题的算法不一定是唯一的。

答案为C。

2.答:选项A的时间复杂度为O(n)。

选项B的时间复杂度为O(n)。

选项C 的时间复杂度为O(log2n)。

选项D的时间复杂度为O(nlog2n)。

答案为C。

第3 章─分治法1.分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。

这要求原问题和子问题()。

A.问题规模相同,问题性质相同B.问题规模相同,问题性质不同C.问题规模不同,问题性质相同D.问题规模不同,问题性质不同2.在寻找n个元素中第k小元素问题中,如快速排序算法思想,运用分治算法对n个元素进行划分,如何选择划分基准?下面()答案解释最合理。

A.随机选择一个元素作为划分基准B.取子序列的第一个元素作为划分基准C.用中位数的中位数方法寻找划分基准D.以上皆可行。

但不同方法,算法复杂度上界可能不同3.对于下列二分查找算法,以下正确的是()。

A.intbinarySearch(inta[],intn,int x){intlow=0,high=n-1;while(low<=high){intmid=(low+high)/2;if(x==a[mid])returnmid;if(x>a[mid])low=mid;elsehigh=mid;}return –1;}B.intbinarySearch(inta[],intn,int x) { intlow=0,high=n-1;while(low+1!=high){intmid=(low+high)/2;if(x>=a[mid])low=mid;elsehigh=mid;}if(x==a[low])returnlow;elsereturn –1;}C.intbinarySearch(inta[],intn,intx) { intlow=0,high=n-1;while(low<high-1){intmid=(low+high)/2;if(x<a[mid])high=mid;elselow=mid;}if(x==a[low])returnlow;elsereturn –1;}D.intbinarySearch(inta[],intn,int x) {if(n>0&&x>=a[0]){intlow= 0,high=n-1;while(low<high){intmid=(low+high+1)/2;if(x<a[mid])high=mid-1;elselow=mid;}if(x==a[low])returnlow;}return –1;}答案解析:1.答:C。

九章算法——精选推荐

九章算法——精选推荐

九章算法前⾔第⼀天的算法都还没有缓过来,直接就进⼊了第⼆天的算法学习。

前⼀天⼀直在整理Binary Search的笔记,也没有提前预习⼀下,好在Binary Tree算是⾃⼰最熟的地⽅了吧(LeetCode上⾯Binary Tree的题刷了4遍,⽬前95%以上能够Bug Free)所以还能跟得上,今天听了⼀下,觉得学习到最多的,就是把Traverse和Divide Conquer分开来讨论,觉得开启了⼀⽚新的天地!今天写这个博客我就尽量把两种⽅式都写⼀写吧。

Outline:⼆叉树的遍历前序遍历traverse⽅法前序遍历⾮递归⽅法前序遍历分治法遍历⽅法与分治法Maximum Depth of Binary TreeBalanced Binary Tree⼆叉树的最⼤路径和 (root->leaf)Binary Tree Maximum Path Sum II (root->any)Binary Tree Maximum Path Sum (any->any)⼆叉查找树Validate Binary Search TreeBinary Search Tree Iterator⼆叉树的宽度优先搜索Binary Tree Level-Order Traversal课堂笔记1.⼆叉树的遍历这个应该是⼆叉树⾥⾯最基本的题了,但是在⾯试过程中,不⼀定会考递归的⽅式,很有可能会让你写出⾮递归的⽅法,上课的时候⽼师也提到过,应该直接把⾮递归的⽅法背下来。

这⾥我就不多说了,直接把中序遍历的两种⽅法贴出来吧,最后再加⼊⼀个分治法(这也是第⼀次写,感觉很棒呢,都不需要太多的思考)。

1.1 前序遍历traverse⽅法(Bug Free):vector<int> res;void helper(TreeNode* root) {if (!root) return;res.push_back(root->val);if (root->left) {helper(root->left);}if (root->right) {helper(root->right);}}vector<int> preorderTraversal(TreeNode *root) {if (!root) {return res;}helper(root);return res;}1.2 前序遍历⾮递归⽅法(Bug Free):vector<int> preorderTraversal(TreeNode *root) {vector<int> res;if (!root) {return res;}stack<TreeNode*> s;s.push(root);while (!s.empty()) {TreeNode* tmp = s.top();s.pop();res.push_back(tmp->val);// 这⾥注意:栈是先进后出,所以先push右⼦树if (tmp->right) {s.push(tmp->right);}if (tmp->left) {s.push(tmp->left);}}return res;}1.3 前序遍历分治法(Java实现):vector<int> preorderTraversal(TreeNode *root) {vector<int> res;if (!root) {return res;}//Dividevector<int> left = preorderTraversal(root->left);vector<int> right = preorderTraversal(root->right);//Conquerres.push_back(root->val);res.insert(res.end(), left.begin(), left.end());res.insert(res.end(), right.begin(), right.end());return res;}这三种⽅法也是⽐较直观的,前两个⽐较基础,我就不详细叙述了,但是分治法是值得重点说⼀说的。

算法概论

算法概论
9
1.3 描述算法
2.Java数据类型 2.Java数据类型 Java
基本数据类型:详见下页表1-1
数据类型
非基本数据类型:如 Byte, Integer, Boolean, String等。
Java对两种数据类型的不同处理方式:
对基本数据类型:在声明一个具有基本数据类型的变量时,自 动建立该数据类型的对象(或称实例)。如:int k; 对非基本数据类型:语句 String s; 并不建立具有数据类型 String的对象,而是建立一个类型String的引用对象, 数据类型为String的对象可用下面的new语句建立。 s = new String String(“Welcome”); String(“Welcome”); String s = new String
20
1.4 算法复杂性分析
• 目的:
– 分析算法就是估计算法所需资源(时间,空间, 通信带宽等) ,以便选取有效的算法。
• 计算模型:
– 单 处 理 机 , 随 机 存 取 机 ( Random-Access Machine,RAM)计算模型,其中指令是顺序执 行的,无并发操作
• 涉及的知识基础:
算法设计与分析
云南大学旅游文化学院信科系
主讲:周华君
1
主要内容介绍
• • • • • • 第1章 第2章 第3章 第4章 第5章 第6章 算法引论 递归与分治策略 动态规划 贪心算法 回溯法 分支限界法
2
主要内容介绍(续)
• • • • 第7章 第8章 第9章 第10章 概率算法 NP完全性理论 近似算法 算法优化策略
– 离散组合数学、概率论、代数等(分析)、程 序设计、数据结构(算法设计)
1.4 算法复杂性分析

算法设计与分析_王红梅_课后答案网(部分)

算法设计与分析_王红梅_课后答案网(部分)

第六章动态规划法• P137 2 ,3, 4•2.解答:cost[i]表示从顶点i 到终点n-1 的最短路径,path[i]表示从顶点i 到终点n-1 的路径上顶点i 的下一个顶点。

cost[i]=min{cij+cost[j]}3 有5 个物品,其重量分别是{3, 2, 1, 4,5},价值分别为{25, 20, 15, 40, 50},背包的容量为6。

V[i][j]表示把前i 个物品装入容量为j 的背包中获得的最大价值。

最优解为(0,0,1,0,1)最优值为65. 4.序列A =(x, z , y , z , z , y,x ),B =(z , x , y , y , z , x , z ),建立两个(m+1)×(n+1)的二 维表L 和表S ,分别存放搜索过程中得到的子序列的长度和状态。

z , x , y , y , z,x , z )path[i]= 使 cij+cost[j] 最小的 j i 012345678 9 10 11 12 13 14 15 Cost[i] 18 13 16 13 10 9 12 7 6875943Path[i]145778911 11 11 13 14 14 15 15 0得到最短路径 0->1->4->7->11->14->15 , 长度为 18(a)长度矩阵L(b)状态矩阵S 。

第七章贪心算法2.背包问题:有7 个物品,背包容量W=15。

将给定物品按单位重量价值从大到小排序,结果如下:个物品,物品重量存放在数组w[n]中,价值存放在数组放在数组x[n]中。

按算法7.6——背包问题1.改变数组w 和v 的排列顺序,使其按单位重量价值v[i]/w[i]降序排列;2.将数组x[n]初始化为0;//初始化解向量3.i=1;4.循环直到( w[i]>C )4.1 x[i]=1; //将第i个物品放入背包4.2 C=C-w[i];4.3 i++;5. x[i]=C/w[i];得出,该背包问题的求解过程为:: x[1]=1;c=15-1=14 v=6 x[2]=1; c=14-2=12V=6+10=10 x[3]=1; c=12-4=8V=16+18=34 x[4]=1; c=8-5=3V=34+15=49 x[5]=1; c=3-1=2 V=49+3=52x[6]=2/3 ; c=0; V=52+5*2/3=156/3 最优值为156/3 最优解为(1,1,1,1,1,2/3,0)) (x[i]按排序后物品的顺序构造)5.可以将该问题抽象为图的着色问题,活动抽象为顶点,不相容的活动用边相连(也可以将该问题理解为最大相容子集问题,重复查找剩余活动的最大相容子集,子集个数为所求).具体参见算法7.3 算法7.3——图着色问题1.color[1]=1; //顶点1着颜色12.for (i=2; i<=n; i++) //其他所有顶点置未着色状态color[i]=0;3.k=0;4.循环直到所有顶点均着色4.1k++; //取下一个颜色4.2for (i=2; i<=n; i++) //用颜色k 为尽量多的顶点着色4.2.1 若顶点i已着色,则转步骤4.2,考虑下一个顶点;4.2.2 若图中与顶点i邻接的顶点着色与顶点i着颜色k 不冲突,则color[i]=k;5.输出k;第八章回溯法4.搜索空间(a) 一个无向图(b) 回溯法搜索空间最优解为(1,2,1,2,3)5.0-1 背包问题n∑w i x i≤c 1• 可行性约束函数:i =1• 上界函数:nr =∑Vi5 = 3A B *CD8 ** * 131 =12 =23 = 14 = 2 34215课后答案网()i=k+1 1第九章分支限界法5,解:应用贪心法求得近似解:(1,4,2,3),其路径代价为:3+5+7+6=21,这可以作为该问题的上界。

03贪心算法

03贪心算法

第3章贪心算法贪心算法一般来说是解决“最优问题”,具有编程简单、运行效率高、空间复杂度低等特点。

是程序竞赛中的一个有力武器,受到广大同学们的青睐。

贪心算法一般是求“最优解”这类问题的。

最优解问题可描述为:有n个输入,它的解是由这n个输入的某个子集组成,并且这个子集必须满足事先给定的条件。

这个条件称为约束条件。

而把满足约束条件的子集称为该问题的可行解。

这些可行解可能有多个。

为了衡量可行解的优劣,事先给了一个关于可行解的函数,称为目标函数。

目标函数最大(或最小)的可行解,称为最优解。

贪心算法的正确性证明虽然不容易,但一些常见的方法还是值得总结的。

1.构造法根据描述的算法,用贪心的策略,依次构造出一个解,可证明一定是合法的解。

即用贪心法找可行解。

2.反证法用贪心的策略,依次构造出一个解S1。

假设最优解S2不同与S1,可以证明是矛盾的。

从而S1就是最优解。

3.调整法用贪心的策略,依次构造出一个解S1。

假设最优解S2不同与S1,找出不同之处,在不破坏最优性的前提下,逐步调整S2,最终使其变为S1。

从而S1也是最优解。

3.1 构造法构造法就是从一个空的解开始,根据贪心策略,逐步将新的内容加入原有的解中,直到满足要求或无法将新的元素加入为止。

也可以将使用相反的手段,即先将整个解设定为一个最大的集合,然后,用贪心策略逐步从原有解中取出元素,直至满足要求或无法取出元素为止。

本节例题将介绍第一种贪心的例子。

3.1.1 〖案例1〗订票一家票务办公室为音乐会售票。

它们以出售某一固定数量的连号票(简称套票)来替代常见的单张票销售。

票务办收到了大量的购票订单。

套票的订单以该套票中最小的座位号作为标识。

然而票务办并不能满足所有的订单,而且如果他们完全按照观众的要求来分·60· ACM 程序设计培训教程配座位,就会出现很多空位。

为此票务办采取了如下的座位分配和价格策略:如果一个订单被接受且完全按照观众的要求安排座位,那么观众就要付全价(每套票2 petaks);如果一个订单虽被接受但是至少有一个座位与观众的要求不同,那么顾客只需付半价(每套票1 petaks)。

吴文虎程序设计基础(第4版)第1-3章 教材精讲

吴文虎程序设计基础(第4版)第1-3章 教材精讲

第一章 绪论
2.以学生为中心 学生是教学的主体,安排教学首先须考虑培养目标、 学生的认知规律和学习特点。 教学的每一个环节都要顾及学生的实际情况,有利 于调动学生学习的积极性,引导学生主动学习。
第一章 绪论
3.强化实践 这门课主张程序设计是高强度的脑力劳动,不是听 会的、也不是看会的,而是练会的。这可能与以往的教 学安排最大的不同之处。 4.鼓励和引导探索式的学习 按照建构主义的学习理论,学生(作为学习的主体) 在与客观环境(所学内容)的交互过程中构建自己的知 识结构的。引导学生在解题编程的实践中探索其中带规 律性的认识。将感性认识升华到理性高度。
(7)main()是每一个C++程序都必须有的,称 为主函数。可以把它看成是程序的入口。
2.3 输出流对象cout
2.3 输出流对象cout
在C++中引入了术语stream(流),指的是来自设备 或传给设备的一个数据流。
cout 示出流对象,它是输入输出流库的一部分。与 cout 相关联的设备是显示器。在程序中有了关联字 cout 就有了将数据流传到显示器的条件,这时用插入 操作符“ < < ”将其后的数据插入该流中去。比如下 面的两条语句
什么是变量? 变量在使用前必须加以定义在程序中经过操作其值 允许改变的量称为变量。 变量名的规定: 变量名的第一个字符必须是字母或下画线,其后的 字符只能是字母、数字和下画线,且所用的名字不得与 C/C++语言系统所保留的关键字相同。变量中的字母 是区分大小写的
3.2 变量与数据类型
1.整型:即整数类型,它又可分为4种:
第一章 绪论
1.5 教学内容安排 (1)绪论:程序设计的基本概念与基本方法,本 课程的学习方法; (2)编程准备; (3)代数思维与计算机解题; (4)逻辑思维与计算机解题; (5)函数思维与模块化设计; (6)数据的组织与处理(1)——数组; (7)数据的组织与处理(2)——结构;

贪心算法

贪心算法

6.贪心方法模型
a.工程计划模型 b.部分背包与每步最优 c.构造贪心算法
a.工程计划模型
我们常常碰到这样的问题:完成一个工程需
要若干个步骤,每个步骤都有若干种方法, 图示—— 步骤a 步骤b 步骤c ... 步骤n 方法b1 方法c1 方法a1 方法b2 方法c2 方法n1 方法a2 方法b3 方法c3 方法c4

种树问题:一条街道分为n个区域(按1-n编号), 每个都可种一棵树。有m户居民,每户会要求在区 域i-j区间内种至少一棵树。现求一个能满足所有要 求且种树最少的方案。 算法构造: 1.对于要求,以区间右端(升序)为首要关键字, 左端(升序)为次要关键字排序。 2.按排好的序依次考察这些要求,若未满足,则在 其最右端的区域种树,这时可能会满足多个要求。 证明思路:解法并不唯一,关键是证明没有比该解 法更好的解法。按步骤1排序之后,会发现对于每 个要求,在最右边的区域内种树所得的结果总不会 差于在其他区域种树。至于为什么这样排序,留给 你——读者们思考吧。

每个方法有一个权值(如效率、质量),其大小往 往和其他步骤中选取的方法有关。有些时候权值无 意义,表示方法不可选择。要求给出一个方法组合, 是权值和最大。 在这里,暂且把它称作“工程计划”。很多实际问 题都可以归纳为这个模型。 对于不同形式的工程计划,我们有不同的解法。 若权值与整个过程或前后步骤的方法选择都有关, 我们使用搜索算法——时间复杂度高得吓人。 若每个权值只与上(或下)一步或少数几步的方法 选择都有关,我们使用动态规划——有比较高的效 率,在下一章会讲到。 若每个权值与其他步骤的方法选择都没有关系,我 们使用贪心方法。

算法分析:设a[i]为第I堆纸牌的张数(0<=I<=n), v为均分后每堆纸牌的张数,s为最小移动次数。 我们用贪心算法,按照从左到右的顺序移动纸牌。 如第I堆的纸牌数不等于平均值,则移动一次(即s 加1),分两种情况移动: 1.若a[i]>v,则将a[i]-v张从第I堆移动到第I+1堆; 2.若a[i]<v,则将v-a[i]张从第I+1堆移动到第I堆。 为了设计的方便,我们把这两种情况统一看作是将 a[i]-v从第I堆移动到第I+1堆,移动后有a[i]=v; a[I+1]=a[I+1]+a[i]-v. 在从第I+1堆取出纸牌补充第I堆的过程中可能回出 现第I+1堆的纸牌小于零的情况。

算法设计与分析(安徽理工大学)智慧树知到答案章节测试2023年

算法设计与分析(安徽理工大学)智慧树知到答案章节测试2023年

第一章测试1.算法的重要特性( )。

A:能行性B:输出C:有穷性D:确定性E:输入答案:ABCDE2.语句 return sum(x,y);执行频度为1 ( )A:对B:错答案:B3.的上界函数是 ( )A:对B:错答案:A4.算法时间复杂度为O(1)说明算法执行时间是单位时间( )A:对B:错答案:B5.集合的位向量表示法,合并集合操作的时间复杂度为( )A:B:C:D:答案:A6.带加权规则的Union算法中,Parent(1)=-8,Parent(2)=-4,1、2代表的集合合并后,集合的根是1,Parent(1)=-12,Parent(2)=1( )A:对B:错答案:A7.写一个算法交换两个变量x、y的值不使用第三个变量。

答案:8.求下列函数的渐进表达式:; ; ;答案:9.的渐进表达式=____答案:10.按照渐进阶从低到高的顺序排列以下表达式:,,, ,,,。

答案:第二章测试1.递归程序每一次递归执行的语句都完全相同( )A:对B:错答案:B2.对数组ary[0:n-1]求和,采用如下递归方式:arysum(n)=ary[n-1]+arysum(n-1),递归方式是( )A:线性递归B:非线性递归答案:A3.问题规模为的全排列问题,可以看作个规模为的全排列问题,因此时间复杂度为: ( )A:错B:对答案:B4.递归程序简洁明了,因此比非递归程序执行效率高( )A:错B:对答案:A5.Master Method适应于求解形式如T(n)=aT(n/b)+f(n)的递归关系式。

其中,a表示子问题个数, n/b子问题规模,f(n)表示划分子问题或整合子问题解的时间。

( )A:对B:错答案:A6.递归关系式:F(n)=F(n-1)+F(n-2)+1是二阶齐次常系数线性递归式。

( )A:错B:对答案:A7.解形式为( )(p均为待定系数):A:B:C:D:答案:C8.求解非线性变系数递归关系式一个原则是“变换”,经过变换将其转换为线性常系数等常规可求的递归式。

第9章 图算法设计-算法设计与分析(第2版)-李春葆-清华大学出版社

第9章 图算法设计-算法设计与分析(第2版)-李春葆-清华大学出版社

{ lowcost[j]=g.edges[k][j];
closest[j]=k;
}
}
}
Prim()算法中有两重for循环,所以时间复杂度为O(n2),其中n为 图的顶点个数。
3. 普里姆算法的正确性证明
普里姆算法是一种贪心算法。对于带权连通无向图G=(V,E),采用 通过对算法步骤的归纳来证明普里姆算法的正确性。
8
2
4
3
6
lowcost[1]最小,将k=1添加到U中
U
0
6
1
仅修改V-U中顶点j:
1
4 3
g.edges[k][j]<lowcost[j] 调整
5
6
2
lowcost[j]=g.edges[k][j]
7
5
8
4
3
6
2
V-U
closest[j]=k
Prim(g,v)算法利用上述过程构造最小生成树,其中参数g为带权 邻接矩阵,v为起始顶点的编号。
k=j;
//k记录最近顶点的编号
}
printf(" 边(%d,%d)权为:%d\n",closest[k],k,mincost);
lowcost[k]=0;
//标记k已经加入U
for (j=0;j<g.n;j++)
//修改数组lowcost和closest
if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j])
void Prim(MGraph g,int v)
//Prim算法
{ int lowcost[MAXV];
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对右图中的有向图, 如何考虑用贪心法获 得从源顶点1到其他顶 点间最短路径
设置顶点集合S并不断地作贪心选择来扩充这个集合。 一个顶点属于集合S当且仅当从源到该顶点的最短路径长 度已知。 初始时,S中仅含有源。 设u是G的某一个顶点,把从源到u且中间只经过S中顶点的 路称为从源到u的特殊路径,并用数组dist记录当前每 个顶点所对应的最短特殊路径长度。 Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶 点u,将u添加到S中,同时对数组dist作必要的修改。 一旦S包含了所有V中顶点,dist就记录了从源到所有其 他顶点之间的最短路径长度。
证明: 只要证明只包含E’但不包含e的生成树不是最 小生成树。 设不包含e的为T(它是在{Ti}的基 础上生成的), 包含e的为T*。 要证明代价 w(T) > w(T*). T的形状如右图, e不在其上 若增加上e以后必有回路,而在回路上又必有大于 e的边,从而去掉大于e的边又产生一个树(它 含有e)叫T*。
9.2 Kruskal 最小生成树算法
算法思想
以图上的边为出发点逐次选择最小
生成树的边,贪心策略的原则为,
所选的当前最小边与已有的边不构
成回路。
边 初始状态 (v2, v3)
权值
VS状态 {v1} {v2} {v3} {v4} {v5} {v6}
图示
执行过程
1
{v1} {v2, v3} {v4} {v5} {v6}
间O(|E|log|E|)
贪心法的特点
• 逐步给出解的各部分, • 在每一步“贪婪地” 选择最好的部分解 • 最优子结构性质
当一个问题的最优解包含其子问题的最优解时, 称此问题具有最优子结构性质。问题的最优子结 构性质是该问题可用动态规划算法或贪心算法求 解的关键特征。
贪心算法与动态规划算法的差异
9.1 Prim算法
算法思想
以图上的顶点为出发点,逐次选择 最小生成树的顶点,策略为每次总 是选择 距离最小生成树顶点集最 近的顶点。
算法描述
Prim基本思想
设G=(V,E)是连通带权图,V={1,2,…,n}。
首先置S={1}
然后,只要S是V的真子集,就作如下的贪心选择:
选取满足条件iS,jV-S,且c[i][j]最小的边
1 快速查找
• 两个数据结构: • 使用一个数组,用数组的下标表示S中的元素,数组中 的值指出包含这些元素的子集代表。 • 每一个子集用链表表示,表头包含指向表头和表尾元素 的指针和大小以及表中的元素个数 • 对于初始集合S={1,2,3,4,5,6}
下标 1 值
2
3
4
5
6
• • • • •
初始集合S={1,2,3,4,5,6} 通过6次makeset(i)产生6个单元素子集 {1}, {2},{3}, {4}, {5}, {6} 对于上述数据结构的操作 把数组中的值设为相应子集的代表元素 下标 1 1 值 2 2 3 3 4 4 5 5 6 6
• • • •
换一个解释(从森林的角度): 初始时,有|V|个树构成的森林 最终的森林由单独的树构成 每次迭代中新边的加入等价于从图中找到一条边, 当顶点分别属于不同的树时,选取该边,使两棵 树变为一棵更大的树。
• 通过union-find(并查)算法实现,对两个顶点是 否属于同棵树(集合)的考察
• 贪心算法以自顶向下的方式进行,以迭代的方式 作出相继的贪心选择,每作一次贪心选择就将所 求问题简化为规模更小的子问题。 • 如:0-1背包问题 max(i,j)表示在i个物品中挑 选物品放入容量为j的背包的最大物品价值。假 设有n个物品 • max(n,j)->maxValue(n)+ max(n-1,k)->
9.3 单源最短路径
给定带权有向图G =(V,E),其中每条边的权 是非负实数。 给定V中的一个顶点,称为源。 计算从源到所有其他各顶点的最短路径长度。 这里路径的长度是指路径上各边权之和。 这个问题通常称为单源最短路径问题。 1.算法基本思想
Dijkstra算法是解单源最短路径问题的贪心算法。
9.3 单源最短路径
• 注意:分析是从顶向下分析,但写程序时是从底 向上进行。
课堂练习
给图的所有结点着色,限制为 ①一条边的两个端点不能用同样 的颜色, ②要求所使用的不同颜色的数目 最小。
3
1
5
2
4
• 有5个结点的图。将结点任意编号为1至5.然 后按编号给结点着色, • 从贪婪法观点考虑,每次给尽可能多的结点着 色。 • 首先用颜色1,可给节点1和2着色。 • 现在必须更换颜色,颜色2可给结点3和4着色。 • 这时又不得不换颜色,颜色3给结点5着色。 • 但很显然,更好的办法只要两种颜色,一种给 结点1、3、4着色,另一种给结点2、5着色。
第九章 贪心法
贪心法基本思想
• 逐步给出解的各部分, • 在每一步“贪婪地” 选择最好的部分解,但不顾 及这样选择对整体的影响, • 因此一般得到的不是最优解。 • 但对许多问题它能产生整体最优解。 如单源最短路经问题,最小生成树问题等。 在一些情况下,即使贪心算法不能得到整体最优解, 其最终结果却是最优解的很好近似。
在选择装入背包的物品时,对每种物品i只有2种 选择,即装入背包或不装入背包。不能将物品i装入 背包多次,也不能只装入部分的物品i。
背包问题:
与0-1背包问题类似,所不同的是在选择物品 i装入背包时,可以选择物品i的一部分,而不一 定要全部装入背包,1≤i≤n。
这2类问题都具有最优子结构性质,极为相似,但 背包问题可以用贪心算法求解,而0-1背包问题 却不能用贪心算法求解。
(v4, v5)
(v2, v4)
2
3
{v1} {v2, v3} {v4, v5} {v6}
{v1} {v2, v3, v4, v5} {v6}
(v4, v6)
(v1, v2)
4
5
{v1} {v2, v3, v4, v5, v6}
{v1, v2, v3, v4, v5, v6}
算法正确性
定理: Ti =< Vi , Ei >为一组生成森林,e=(u, v),其中u∈ Vi, v ∈ Vj, i ≠j, 且(u, v)为当前一条最小权的边,则G有 一个包含 e ∪E’的最小生成树,其中 E ’= ∪Ei
贪心法要素总结(参考)
• • • • • • • • • • • (1)明确目标函数和约束条件 (2)制定部分解结构。 确定如何将待解问题分解成若干步骤 Prim算法:最小生成树的子树 背包问题:一部分一部分装入 (3)确定贪心策略 扩大部分解的方法,一般涉及极值选择 (4)确定候选集 明确贪心的选择范围 (5)调整候选集 (6)正确性证明
9.5 哈夫曼编码
• • • • • 编码:文本中的字符赋予一串比特位所有的比特串都不是另一个字符比特串 的前缀 • 考虑将字符和二叉树的叶子联系起来形成前缀码
• 贪心法要求每次在构造部分解的时候都挑一个 最好的部分解。 • 背包问题中什么是最好的部分解
– 单位价值最大的物品即为最好的部分解 – 因此在背包问题中每次都挑当前单位价值最大的 物品,并尽可能多的放入包中。
• n=3 w={10,20,30} v={60,100,120} c=50
– 单位价值V/w={6,5,4} – 因此第一次挑一号物品,全部装入r=40,pv=60 – 第二次挑2号,全部装入r=20,pv=160 – 第三次挑3号,部分装入r=20,pv=160+80=240
• N次union的时间效率? • 一系列按大小求并的操作,可证明最差效率是 • O(nlogn)
2 快速求并
• 用树表示每个子集 根元素作为子集代表 • 树中的边从子女指向他们的父母 维护一个从集合元素到树中节点的映射 • 如对于S1={1,4,5,2} S2={3,6} union(5,6)
算法实现的数据结构 ------不相交子集和并查算法
• 许多应用要求把一个n个元素集合S动态划分为 一系列不相交的子集。 • 对不相交子集求并集和查找的混合操作 • 用makeset(x):生成一个单元素集合{x}。设该操 作对集合S的每个元素只能应用一次。 • Find(x):返回一个包含x的子集 • Union(x,y):构造分别包含x和y的不相交子集的 并集并把它添加到子集的集合中,取代原来的两 个子集。
1 1
3
4 5 6 2 4 5
3
6
2
• Makeset(x)的时间效率Θ(1)
• Union(x,y)的时间效率是Θ(1)
• Find(x)从包含x的节点开始找到根,考虑最
差情况,退化为一个n节点的链表O(n)
• 运行时间: 若采用高效的并查算法 则kruskal算法的
运行时间取决于对图中边的权重排序的时
Dijkstra算法的迭代过程: 迭代 初始 1 2 3 4 S {1} {1,2} {1,2,4} {1,2,4,3} {1,2,4,3,5} u 2 4 3 5 dist[2] dist[3] dist[4] dist[5] 10 10 10 10 10 maxint 60 50 50 50 30 30 30 30 30 100 100 90 60 60
• 链表为6个单节点链表 • List1 1
1
null
• Makeset(i)的时间效率是多少?
• 假设执行union(1,4) 下标 1 1 值
1
2 2
1
3 3
null 1
4 4
5 5
6 6
4 null
下标 1

2
2
2
1
3
3
4
1
4
5
5
null
6
6 一次union 操作的时间 效率
相关文档
最新文档