SlideShare uma empresa Scribd logo
1 de 60
第 10 章 综合应用设计
 10.1 数组和集合
 10.2 实现迭代器
 10.3 算法设计策略
 10.4
课程设计的目的、要求和选题
目的
 目的:综合运用数据结构课程所讨论的
基 础知识和基本理论,解决具有一
定 规模的、中等难度的实际应用问
题,培养综合应用设计能力。
 内容: Java 集合框架;多种算法设计
策 略。
《数据结构( Java 版)(第 3 版)》
10.1 数组和集合
10.1.1 Arrays 数组类
( 1 ) 比较两个数组是否相等
public static boolean equals(Object[] a,
Object[] b)
( 2 ) 填充
public static void fill(Object[] a, Object
obj)
public static void fill(long[] a, int begin, int
end, long value)
《数据结构( Java 版)(第 3 版)》
10.1.1 Arrays 数组类
( 3 ) 排序
public static void sort(Object[] a)
public static <T> void sort(T[] a,
Comparator<? super T> c)
( 4 ) 二分法查找
public static int binarySearch(Object[] a,
int begin, int end, Object key)
public static <T> int binarySearch(T[] a, T
key, Comparator<? super T> c)
《数据结构( Java 版)(第 3 版)》
java.util.Comparator 比较器
接口
public interface Comparator<T>
{
int compare(T cobj1, T cobj2);
// 指定比较两个对象大小的
规则
}
《数据结构( Java 版)(第 3 版)》
10.1.2 Java 集合框架
1. 集合框架结构
《数据结构( Java 版)(第 3 版)》
表 10-1 集合框架中的主要接口
和类
接 口
实现接口的类
一维数组 循环双链表 平衡二叉树 散列表
Set 集合 TreeSet HashSet
List 列表
ArrayLis
t
LinkedList
Map 映
射
TreeMap HashMap
《数据结构( Java 版)(第 3 版)》
2. 迭代
( 1 ) java.util.Iterator 和 ListIterator 迭代器接
口
public interface Iterator<T> // 迭代器接口
{
boolean hasNext(); // 判断是否有后继元素
T next(); // 返回后继元
素
void remove();
// 删除迭代器对象表示的集合当前元素
《数据结构( Java 版)(第 3 版)》
java.util.ListIterator 列表迭代器
接口
public interface ListIterator<T> extends
Iterator<T>
{
boolean hasPrevious();// 判断是否有前驱元素
T previous(); // 返回前驱元素
int nextIndex(); // 返回后继元素序号
int previousIndex(); // 返回前驱元素序号
void set(T x); // 将集合当前元素替
换为 x
void add(T x); // 增加元素 x
《数据结构( Java 版)(第 3 版)》
( 2 ) java.lang.Iterable 可迭
代接口
public interface Iterable<T>
{
Iterator<T> iterator();
}
《数据结构( Java 版)(第 3 版)》
3.Collection 接口
public interface Collection<T> extends Iterable<T>
{ Iterator<T> iterator(); // 获得迭代器
boolean isEmpty(); // 判断集合是否为
空
int size(); // 返回集合的元
素个数
boolean contains(Object obj); // 判断是否包含指定
元素
boolean add(T element); // 增加指定元素
boolean remove(Object obj); // 移去首次出现指定元
素
void clear(); // 移去所有元素
// 以下方法描述集合运算,参数是另一个集合
boolean equals(Object obj); // 比较两个集合是否
相等
boolean containsAll(Collection<?> c); // 判断集合包
含
《数据结构( Java 版)(第 3 版)》
4. 列表
( 1 ) List 接口
public interface List<T> extends
Collection<T>
{
T get(int i) // 返回第 i ( i≥0 )个元素
T set(int i, T x) // 用 x 替换原第 i 个元素
ListIterator<T> listIterator()
// 返回列表迭代器对象
}
( 2 ) ArrayList 类
( 3 ) LinkedList 类
《数据结构( Java 版)(第 3 版)》
5. Collections 类
public class Collections
{
public static<T> T max(Collection<? extends
T> coll,Comparator<? super T> c) // 最大值
public static <T> T min(Collection<?
extends T> coll, Comparator<? super T>
c) // 最小值
public static<T> int binarySearch(List<?
extends Comparable<? super T>> list,T
key)
public static<T> void sort(List<T> list,
《数据结构( Java 版)(第 3 版)》
【例 10.1 】 电话簿。
1. Friend 类表示电话簿对象,实现可比
较、比较器和序列化接口。
2. TelephoneBookTreeSet 类实现电话
簿的存储和管理。
3. TelephoneBookJFrame 类实现电话
簿的图形用户界面,提供添加、查找和
删除功能。
《数据结构( Java 版)(第 3 版)》
电话簿管理窗口中两个分割
窗格的布局层次
《数据结构( Java 版)(第 3 版)》
10.2 实现迭代器
10.2.1 基于迭代器的操作
10.2.2 提供迭代器对象
《数据结构( Java 版)(第 3 版)》
10.2.1 基于迭代器的操作
1. 抽象集合类
public abstract class AbstractCCollection<T> implements
Iterable<T>
{ public abstract java.util.Iterator<T> iterator();
public String toString()
{ java.util.Iterator<T> it = this.iterator();
String str="(";
while (it.hasNext()) // 若有后继
元素
{ str += it.next().toString(); // 添加后继元素字
符串
if (it.hasNext())
str += ", ";
}
return str+")";
《数据结构( Java 版)(第 3 版)》
2. 抽象列表类
public abstract class AbstractLList<T> extends
AbstractCCollection<T>
{
public boolean equals(Object obj)
{ if (obj == this)
return true;
if (!(obj instanceof AbstractLList))
return false;
java.util.Iterator<T> it1 = this.iterator();
java.util.Iterator<T> it2 =
((AbstractLList<T>)obj).iterator();
while (it1.hasNext() && it2.hasNext())
if (!(it1.next().equals(it2.next())))
return false;
return !it1.hasNext() && !it2.hasNext();
《数据结构( Java 版)(第 3 版)》
10.2.2 提供迭代器对象
1. 顺序表类提供迭代器对象
public class SeqList<T> extends AbstractLList<T>
implements LList<T>
{
public java.util.Iterator<T> iterator()
{ // 返回 Java 迭
代器对象
return new SeqIterator();
}
private class SeqIterator implements
java.util.Iterator<T> // 私有内部类,实现迭代器接
口
《数据结构( Java 版)(第 3 版)》
2. 单链表类提供迭代器对象
public class SinglyLinkedList<T> extends
AbstractLList<T> implements LList<T>
{
public java.util.Iterator<T> iterator()
{ // 返回 Java 迭代器
对象
return new SinglyIterator();
}
private class SinglyIterator implements
java.util.Iterator<T>// 私有内部类,实现迭代器接口
{……}
《数据结构( Java 版)(第 3 版)》
本书线性表接口和类的层次关
系
《数据结构( Java 版)(第 3 版)》
10.3 算法设计策略
10.3.1 分治法
10.3.2 动态规划法
10.3.3 贪心法
10.3.4 回溯法
《数据结构( Java 版)(第 3 版)》
10.3.1 分治法
1. 分治策略
分治法( divide and conquer )采用分而治之、逐
个解决的策略。孙子兵法曰“凡治众如治寡,分数是
也。”
1. 分治与递归
结果 求解问题(问题规模)
{
if (问题规模足够小) // 递归边
界条件
求解小规模子问题;
else
分解,求解问题(问题规模缩小); // 递归
调用
return 各子问题合并后的解;
《数据结构( Java 版)(第 3 版)》
深度优先搜索遍历二叉树、树和图,以及折
半查找、快速排序都是采用分治策略的算法。
void 遍历(问题规模)
{
if (问题规模 >1 ) // 继续递归
{ 访问当前元素;
while (存在子问题) // 分解成若干子
问题
遍历(子问题规模); // 递归调
用
《数据结构( Java 版)(第 3 版)》
10.3.2 动态规划法
1. 动态规划
动态规划法( dynamic programming )也
是把一个大问题分解为若干较小的子问题
,通过求解子问题而得到原问题的解。动
态规划法采用备忘录做法。
1. 动态规划法的基本要素
a. 最优子结构
b. 子问题重叠
n
《数据结构( Java 版)(第 3 版)》
【例 10.2 】 动态规划法求组合
数。



>>+=
>===
−
−
− 0
0,01
1
1
1 nmCCC
mnmnC
n
m
n
m
n
m
n
m 或
n
n
m
0 1 2 3 4 5
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
5 1 5 10 10 5 1
《数据结构( Java 版)(第 3 版)》
10.3.3 贪心法
63.6 元 = 10 元 ×6+1 元 ×3+0.1 元 ×6 //15
张
63.6 = 50+10+2+1+0.5+0.1 //6 张(个)
1. 贪心选择策略
贪心法( greedy )是运用局部最优选择以期
获得全局最优解的一种策略。
《数据结构( Java 版)(第 3 版)》
【例 10.3 】 贪心法求解背包问题
。
给定 n 个物品和一个背包,物品 i 的重量为
wi ,价值为 pi ,背包能容纳物品总重量为
W ;设 xi ( 0≤ xi ≤1 )表示物品 i 的几分
之几,求如何选择装入背包的物品(全部
或部分),使背包中物品总价值
最大。
背包问题的约束条件为 ≤ W ,满
足约束条件的 n 元组 是一个
∑=
n
i
ii xp
1
)(
∑=
n
i
ii xw
1
)(
),,,( 21 nxxx 
∑=
n
i
ii xp
1
)(
《数据结构( Java 版)(第 3 版)》
表 10-2 背包问题的多个可
用解
n=3 ,物品 序列为 {(80,20),(50,25),
(15,45)} , W=100 。
),,( 321 xxx ∑=
3
1
)(
i
ii xw )(
3
1
∑=i
ii xp
方
案
可用解 背包重量 背包价值
1 (1, 20/50, 0) 80+20=100 20+25*2/5=30
2 (1, 5/50, 1)
80+5=15=100 20+25*5/50+45
=67.5
3 (50/80, 1, 0) 50+50=100 20*50/80+25=37.5
4 (35/80, 1, 1)
35+50+15=100 20*35/80+25+45
=78.75
),( ii pw
《数据结构( Java 版)(第 3 版)》
10.3.3 贪心法
2. 贪心法的基本要素
a. 贪心选择性质
b. 最优子结构性质
2. 贪心法与动态规划法的区别
《数据结构( Java 版)(第 3 版)》
4. 最小堆
贪心选择策略最简单的应用是求最小值。
public class MinHeap<T extends
java.lang.Comparable<T>>// 最小堆类
{
Comparable [] element;// 最小堆元素数
组
int len; // 最小堆元素
个数
Comparator comparator=null; // 比较
《数据结构( Java 版)(第 3 版)》
图 10-6 最小堆插入和删除元
素
《数据结构( Java 版)(第 3 版)》
5. 贪心策略应用 Prim 算法
《数据结构( Java 版)(第 3 版)》
Dijkstra 算法采用贪
心 选择策略逐步扩
充顶点 A 的单源最短路
径
《数据结构( Java 版)(第 3 版)》
Huffman 算法采用贪心选择策
略 逐步合并森林构造 Huffman
树
《数据结构( Java 版)(第 3 版)》
6. Kruskal 算法实现
《数据结构( Java 版)(第 3 版)》
( 1 )最小生成树类
public class MinSpanTree
{ Edge[] mst; // 边集合
int cost=0; // 代价
public MinSpanTree(int n, Edge[]
edges,
Comparator<Edge> comparator)
{
MinHeap<Edge> minheap = new
MinHeap<Edge>(edges,
comparator);
……
《数据结构( Java 版)(第 3 版)》
例 10.4 以 Kruskal 算法构
造带权无向图的最小生成树。
图 10-10 的所有边按权值构造的最小堆
《数据结构( Java 版)(第 3 版)》
( 2 )并查集类
《数据结构( Java 版)(第 3 版)》
( 2 )并查集类
《数据结构( Java 版)(第 3 版)》
图 10-13 查找集合元素时采
用折叠规则压缩路径
《数据结构( Java 版)(第 3 版)》
10.3.4 回溯法
回溯法( backtracking )在问题的解
空间中,以深度优先策略搜索满足约束条件
的一个解或所有解。二叉树、树和图的深度
优先搜索遍历算法采用的是回溯法。
用回溯法解题通常包含以下三个步骤:
<1> 定义所求问题的解空间。
<2> 构造易于搜索的解空间结构。
<3> 以深度优先方式搜索解空间,并在搜索
过程中用剪枝函数避免无效搜索。
《数据结构( Java 版)(第 3 版)》
1. 问题的解空间及解空间
树
0-1 背包问题( n=3 )解空间是 {(0,0,0) ,
(0,0,1), (0,1,0), (0,1,1), (1,0,0),
(1,0,1), (1,1,0), (1,1,1)}
图 10-14 0-1 背包问题的解空间二叉树
《数据结构( Java 版)(第 3 版)》
图 10-15 穷举法求解 0-1 背包
问题
《数据结构( Java 版)(第 3 版)》
2. 约束集的完备性
若一个 i ( 1≤i≤n )元组
违反涉及到
元素的一个约束条件,则以
为前缀的任何 n 元组
一定也违反相应的约束条件。
),,,( 110 −ixxx 
110 ,,, −ixxx 
),,,( 110 −ixxx 
),,,,,( 1110 −− ni xxxx 
《数据结构( Java 版)(第 3 版)》
3. 回溯策略
1. 深度优先搜索
2. 剪枝:约束剪枝,限界剪枝
3. 递归回溯与迭代回溯
《数据结构( Java 版)(第 3 版)》
0-1 背包问题按背包重量的约
束剪枝
《数据结构( Java 版)(第 3 版)》
0-1 背包问题按背包重量的
限界剪枝
《数据结构( Java 版)(第 3 版)》
例 10.5 回溯法求解 0-1 背包问
题。
1. 物品按重量降序排列
2. 物品按单位重量价值降序排列
图 10-18 0-1 背包问题物品按单位重量价值降序排列的解空
间树
《数据结构( Java 版)(第 3 版)》
【例 10.6 】 回溯法求解八皇后问
题。
a.八皇后问题的解空间
八皇后问题的显约束是
( 0≤i≤7 ),解空间由 个 8 元组构成,范围是
(0,0,0,0,0,0,0,0) ~ (7,7,7,7,7,7,7,7) ,解空间树
是一棵满八叉树。隐约束是任意两个皇后不在同一
列或同一斜线上。
8
8
}7,,1,0{ =∈ ii Sx
《数据结构( Java 版)(第 3 版)》
② 用回溯法求解四皇后问题
的解空间树
《数据结构( Java 版)(第 3 版)》
③ 判断隐约束条件
 任意两个皇后不在同一列上。若 i≠j ,
有 。意为元素各不相同,确定
(0,0,?,?) 等不是解。
 任意两个皇后不在同一斜线上。若
i≠j ,有 。由此约束确定
(0,1,?,?) 、 (0,2,1,?) 、 (0,3,1,0) 等
不是解。
ji xx ≠
jixx ji −≠−
《数据结构( Java 版)(第 3 版)》
1. 用回溯法求解八皇后问题程序
2. 迭代回溯
《数据结构( Java 版)(第 3 版)》
【例 10.7 】 预见算法解骑士游历问
题。
1. 骑士游历问题的解
空间



=
马到达该格的步数自然数
马未到达过0
xyc
一次不成功游历路径
《数据结构( Java 版)(第 3 版)》
② 预见算法
方向 下一位置 可通方向 可通路数
1 (2,4) 1,2,3,4,6,7,8 7
2 (3,5) 1,2,3,4,5,7,8 7
3 (5,5) 1,2,3,4,5,6,8 7
4 (6,4) 1,2,3,6,7 5
5 (6,2) 2,3,6,7,8 5
6 (5,1) 1,3,4,5,8 5
7 (3,1) 1,2,4,5,8 5
8 (2,2) 1,2,3,5,6,7,8 7
《数据结构( Java 版)(第 3 版)》
骑士游历算法流程
《数据结构( Java 版)(第 3 版)》
10.4 课程设计的目的、
要求和选题
数据结构课程设计的目的是,深入理解
数据结构的基本理论,掌握对数据结构各
种操作的算法设计方法,增强对基础知识
和基本方法的综合运用能力,增强对算法
的理解能力,提高软件设计能力,在实践
中培养独立分析问题和解决问题的作风和
能力。
《数据结构( Java 版)(第 3 版)》
数据结构课程设计的要求
综合运用数据结构的基础知识和算法设计
的基本原则,独立编制一个具有中等规模的
、一定难度的、解决实际问题的应用程序;
通过题意分析、选择数据结构、算法设计、
编制程序、调试程序、软件测试、结果分析
、撰写课程设计报告等环节完成软件设计的
全过程,完善算法并提高程序性能。
《数据结构( Java 版)(第 3 版)》
具体要求
a. 选题与数据结构课程内容相关,体现基本的数
据结构和算法设计原则。
b. 算法有明确的思路,模块结构合理,表述清楚
,算法完整,考虑各种可能情况。
c. 采用 Java 语言和面向对象程序设计思想实现
。
d. 程序必须运行通过,对于各种输入数据,有明
确的不同的输出结果。程序运行有错误时,必
须采取各种调试手段排除错误。
《数据结构( Java 版)(第 3 版)》
⑤ 课程设计报告
包括:课程设计目的、题目说明、题
意分析、设计方案、功能说明、实现
技术和手段、程序流程、源程序清单
、运行结果及结果分析、设计经验和
教训总结、存在问题及解决方案等。

Mais conteúdo relacionado

Destaque

María fernanda gbi
María fernanda gbiMaría fernanda gbi
María fernanda gbiMafe Arango
 
Bogdan Daca - Commisioning Refrigeration Certificate
Bogdan Daca - Commisioning Refrigeration CertificateBogdan Daca - Commisioning Refrigeration Certificate
Bogdan Daca - Commisioning Refrigeration CertificateBogdan - Marin Daca
 
Apostila de c ufmg
Apostila de c ufmgApostila de c ufmg
Apostila de c ufmgmiskhe
 
Daca Bogdan - Vega Systems Certificate of Training
Daca Bogdan - Vega Systems Certificate of TrainingDaca Bogdan - Vega Systems Certificate of Training
Daca Bogdan - Vega Systems Certificate of TrainingBogdan - Marin Daca
 

Destaque (8)

Amigos
AmigosAmigos
Amigos
 
CV-Europass-20160914-AldanaVéliz-ES
CV-Europass-20160914-AldanaVéliz-ESCV-Europass-20160914-AldanaVéliz-ES
CV-Europass-20160914-AldanaVéliz-ES
 
María fernanda gbi
María fernanda gbiMaría fernanda gbi
María fernanda gbi
 
Bogdan Daca - Commisioning Refrigeration Certificate
Bogdan Daca - Commisioning Refrigeration CertificateBogdan Daca - Commisioning Refrigeration Certificate
Bogdan Daca - Commisioning Refrigeration Certificate
 
Apostila de c ufmg
Apostila de c ufmgApostila de c ufmg
Apostila de c ufmg
 
Rc RJ Sernambetiba
Rc RJ SernambetibaRc RJ Sernambetiba
Rc RJ Sernambetiba
 
TBP-1996-Convention
TBP-1996-ConventionTBP-1996-Convention
TBP-1996-Convention
 
Daca Bogdan - Vega Systems Certificate of Training
Daca Bogdan - Vega Systems Certificate of TrainingDaca Bogdan - Vega Systems Certificate of Training
Daca Bogdan - Vega Systems Certificate of Training
 

Semelhante a 第10章 综合应用设计(java版)

第08章 查找(java版)
第08章  查找(java版)第08章  查找(java版)
第08章 查找(java版)Yan Li
 
第04章 栈和队列(java版)
第04章  栈和队列(java版)第04章  栈和队列(java版)
第04章 栈和队列(java版)Yan Li
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)Yan Li
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章浒 刘
 
第05章 数组和广义表(java版)
第05章  数组和广义表(java版)第05章  数组和广义表(java版)
第05章 数组和广义表(java版)Yan Li
 
数据结构回顾
数据结构回顾数据结构回顾
数据结构回顾Zehua HONG
 
[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection[圣思园][Java SE]Reflection
[圣思园][Java SE]ReflectionArBing Xie
 
Mdx解决方案(第二版)笔记
Mdx解决方案(第二版)笔记Mdx解决方案(第二版)笔记
Mdx解决方案(第二版)笔记zhejiang university
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典yiditushe
 
Sql Server 高级技巧系列之三整体优化
Sql Server 高级技巧系列之三整体优化Sql Server 高级技巧系列之三整体优化
Sql Server 高级技巧系列之三整体优化向 翔
 
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社pingjiang
 
软件工程 第二章
软件工程 第二章软件工程 第二章
软件工程 第二章浒 刘
 
数据结构 总结与复习
数据结构 总结与复习数据结构 总结与复习
数据结构 总结与复习Wang Yizhe
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研lorisjand
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享晓锋 陈
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)Yan Li
 
第三章 关系数据库标准语言SQL.ppt this is a slide for databases
第三章 关系数据库标准语言SQL.ppt this is a slide for databases第三章 关系数据库标准语言SQL.ppt this is a slide for databases
第三章 关系数据库标准语言SQL.ppt this is a slide for databasesfzgaolanlan1
 
Row Set初步学习V1.1
Row Set初步学习V1.1Row Set初步学习V1.1
Row Set初步学习V1.1Zianed Hou
 

Semelhante a 第10章 综合应用设计(java版) (20)

第08章 查找(java版)
第08章  查找(java版)第08章  查找(java版)
第08章 查找(java版)
 
第04章 栈和队列(java版)
第04章  栈和队列(java版)第04章  栈和队列(java版)
第04章 栈和队列(java版)
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章
 
第05章 数组和广义表(java版)
第05章  数组和广义表(java版)第05章  数组和广义表(java版)
第05章 数组和广义表(java版)
 
数据结构回顾
数据结构回顾数据结构回顾
数据结构回顾
 
[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection
 
Mdx解决方案(第二版)笔记
Mdx解决方案(第二版)笔记Mdx解决方案(第二版)笔记
Mdx解决方案(第二版)笔记
 
Sun java
Sun javaSun java
Sun java
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
 
Sql Server 高级技巧系列之三整体优化
Sql Server 高级技巧系列之三整体优化Sql Server 高级技巧系列之三整体优化
Sql Server 高级技巧系列之三整体优化
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社
 
软件工程 第二章
软件工程 第二章软件工程 第二章
软件工程 第二章
 
数据结构 总结与复习
数据结构 总结与复习数据结构 总结与复习
数据结构 总结与复习
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)
 
第三章 关系数据库标准语言SQL.ppt this is a slide for databases
第三章 关系数据库标准语言SQL.ppt this is a slide for databases第三章 关系数据库标准语言SQL.ppt this is a slide for databases
第三章 关系数据库标准语言SQL.ppt this is a slide for databases
 
Row Set初步学习V1.1
Row Set初步学习V1.1Row Set初步学习V1.1
Row Set初步学习V1.1
 

Mais de Yan Li

Chapter 01 essentials final
Chapter 01 essentials finalChapter 01 essentials final
Chapter 01 essentials finalYan Li
 
Chapter 05 essentials final
Chapter 05 essentials finalChapter 05 essentials final
Chapter 05 essentials finalYan Li
 
Chapter 04 essentials final
Chapter 04 essentials finalChapter 04 essentials final
Chapter 04 essentials finalYan Li
 
Chapter 02 essentials final
Chapter 02 essentials finalChapter 02 essentials final
Chapter 02 essentials finalYan Li
 
Chapter 03 essentials final
Chapter 03 essentials finalChapter 03 essentials final
Chapter 03 essentials finalYan Li
 
Introduction to om
Introduction to omIntroduction to om
Introduction to omYan Li
 
第09章 排序(java版)
第09章  排序(java版)第09章  排序(java版)
第09章 排序(java版)Yan Li
 
第03章 串(java版)
第03章  串(java版)第03章  串(java版)
第03章 串(java版)Yan Li
 

Mais de Yan Li (8)

Chapter 01 essentials final
Chapter 01 essentials finalChapter 01 essentials final
Chapter 01 essentials final
 
Chapter 05 essentials final
Chapter 05 essentials finalChapter 05 essentials final
Chapter 05 essentials final
 
Chapter 04 essentials final
Chapter 04 essentials finalChapter 04 essentials final
Chapter 04 essentials final
 
Chapter 02 essentials final
Chapter 02 essentials finalChapter 02 essentials final
Chapter 02 essentials final
 
Chapter 03 essentials final
Chapter 03 essentials finalChapter 03 essentials final
Chapter 03 essentials final
 
Introduction to om
Introduction to omIntroduction to om
Introduction to om
 
第09章 排序(java版)
第09章  排序(java版)第09章  排序(java版)
第09章 排序(java版)
 
第03章 串(java版)
第03章  串(java版)第03章  串(java版)
第03章 串(java版)
 

第10章 综合应用设计(java版)

  • 1. 第 10 章 综合应用设计  10.1 数组和集合  10.2 实现迭代器  10.3 算法设计策略  10.4 课程设计的目的、要求和选题
  • 2. 目的  目的:综合运用数据结构课程所讨论的 基 础知识和基本理论,解决具有一 定 规模的、中等难度的实际应用问 题,培养综合应用设计能力。  内容: Java 集合框架;多种算法设计 策 略。
  • 3. 《数据结构( Java 版)(第 3 版)》 10.1 数组和集合 10.1.1 Arrays 数组类 ( 1 ) 比较两个数组是否相等 public static boolean equals(Object[] a, Object[] b) ( 2 ) 填充 public static void fill(Object[] a, Object obj) public static void fill(long[] a, int begin, int end, long value)
  • 4. 《数据结构( Java 版)(第 3 版)》 10.1.1 Arrays 数组类 ( 3 ) 排序 public static void sort(Object[] a) public static <T> void sort(T[] a, Comparator<? super T> c) ( 4 ) 二分法查找 public static int binarySearch(Object[] a, int begin, int end, Object key) public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)
  • 5. 《数据结构( Java 版)(第 3 版)》 java.util.Comparator 比较器 接口 public interface Comparator<T> { int compare(T cobj1, T cobj2); // 指定比较两个对象大小的 规则 }
  • 6. 《数据结构( Java 版)(第 3 版)》 10.1.2 Java 集合框架 1. 集合框架结构
  • 7. 《数据结构( Java 版)(第 3 版)》 表 10-1 集合框架中的主要接口 和类 接 口 实现接口的类 一维数组 循环双链表 平衡二叉树 散列表 Set 集合 TreeSet HashSet List 列表 ArrayLis t LinkedList Map 映 射 TreeMap HashMap
  • 8. 《数据结构( Java 版)(第 3 版)》 2. 迭代 ( 1 ) java.util.Iterator 和 ListIterator 迭代器接 口 public interface Iterator<T> // 迭代器接口 { boolean hasNext(); // 判断是否有后继元素 T next(); // 返回后继元 素 void remove(); // 删除迭代器对象表示的集合当前元素
  • 9. 《数据结构( Java 版)(第 3 版)》 java.util.ListIterator 列表迭代器 接口 public interface ListIterator<T> extends Iterator<T> { boolean hasPrevious();// 判断是否有前驱元素 T previous(); // 返回前驱元素 int nextIndex(); // 返回后继元素序号 int previousIndex(); // 返回前驱元素序号 void set(T x); // 将集合当前元素替 换为 x void add(T x); // 增加元素 x
  • 10. 《数据结构( Java 版)(第 3 版)》 ( 2 ) java.lang.Iterable 可迭 代接口 public interface Iterable<T> { Iterator<T> iterator(); }
  • 11. 《数据结构( Java 版)(第 3 版)》 3.Collection 接口 public interface Collection<T> extends Iterable<T> { Iterator<T> iterator(); // 获得迭代器 boolean isEmpty(); // 判断集合是否为 空 int size(); // 返回集合的元 素个数 boolean contains(Object obj); // 判断是否包含指定 元素 boolean add(T element); // 增加指定元素 boolean remove(Object obj); // 移去首次出现指定元 素 void clear(); // 移去所有元素 // 以下方法描述集合运算,参数是另一个集合 boolean equals(Object obj); // 比较两个集合是否 相等 boolean containsAll(Collection<?> c); // 判断集合包 含
  • 12. 《数据结构( Java 版)(第 3 版)》 4. 列表 ( 1 ) List 接口 public interface List<T> extends Collection<T> { T get(int i) // 返回第 i ( i≥0 )个元素 T set(int i, T x) // 用 x 替换原第 i 个元素 ListIterator<T> listIterator() // 返回列表迭代器对象 } ( 2 ) ArrayList 类 ( 3 ) LinkedList 类
  • 13. 《数据结构( Java 版)(第 3 版)》 5. Collections 类 public class Collections { public static<T> T max(Collection<? extends T> coll,Comparator<? super T> c) // 最大值 public static <T> T min(Collection<? extends T> coll, Comparator<? super T> c) // 最小值 public static<T> int binarySearch(List<? extends Comparable<? super T>> list,T key) public static<T> void sort(List<T> list,
  • 14. 《数据结构( Java 版)(第 3 版)》 【例 10.1 】 电话簿。 1. Friend 类表示电话簿对象,实现可比 较、比较器和序列化接口。 2. TelephoneBookTreeSet 类实现电话 簿的存储和管理。 3. TelephoneBookJFrame 类实现电话 簿的图形用户界面,提供添加、查找和 删除功能。
  • 15. 《数据结构( Java 版)(第 3 版)》 电话簿管理窗口中两个分割 窗格的布局层次
  • 16. 《数据结构( Java 版)(第 3 版)》 10.2 实现迭代器 10.2.1 基于迭代器的操作 10.2.2 提供迭代器对象
  • 17. 《数据结构( Java 版)(第 3 版)》 10.2.1 基于迭代器的操作 1. 抽象集合类 public abstract class AbstractCCollection<T> implements Iterable<T> { public abstract java.util.Iterator<T> iterator(); public String toString() { java.util.Iterator<T> it = this.iterator(); String str="("; while (it.hasNext()) // 若有后继 元素 { str += it.next().toString(); // 添加后继元素字 符串 if (it.hasNext()) str += ", "; } return str+")";
  • 18. 《数据结构( Java 版)(第 3 版)》 2. 抽象列表类 public abstract class AbstractLList<T> extends AbstractCCollection<T> { public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof AbstractLList)) return false; java.util.Iterator<T> it1 = this.iterator(); java.util.Iterator<T> it2 = ((AbstractLList<T>)obj).iterator(); while (it1.hasNext() && it2.hasNext()) if (!(it1.next().equals(it2.next()))) return false; return !it1.hasNext() && !it2.hasNext();
  • 19. 《数据结构( Java 版)(第 3 版)》 10.2.2 提供迭代器对象 1. 顺序表类提供迭代器对象 public class SeqList<T> extends AbstractLList<T> implements LList<T> { public java.util.Iterator<T> iterator() { // 返回 Java 迭 代器对象 return new SeqIterator(); } private class SeqIterator implements java.util.Iterator<T> // 私有内部类,实现迭代器接 口
  • 20. 《数据结构( Java 版)(第 3 版)》 2. 单链表类提供迭代器对象 public class SinglyLinkedList<T> extends AbstractLList<T> implements LList<T> { public java.util.Iterator<T> iterator() { // 返回 Java 迭代器 对象 return new SinglyIterator(); } private class SinglyIterator implements java.util.Iterator<T>// 私有内部类,实现迭代器接口 {……}
  • 21. 《数据结构( Java 版)(第 3 版)》 本书线性表接口和类的层次关 系
  • 22. 《数据结构( Java 版)(第 3 版)》 10.3 算法设计策略 10.3.1 分治法 10.3.2 动态规划法 10.3.3 贪心法 10.3.4 回溯法
  • 23. 《数据结构( Java 版)(第 3 版)》 10.3.1 分治法 1. 分治策略 分治法( divide and conquer )采用分而治之、逐 个解决的策略。孙子兵法曰“凡治众如治寡,分数是 也。” 1. 分治与递归 结果 求解问题(问题规模) { if (问题规模足够小) // 递归边 界条件 求解小规模子问题; else 分解,求解问题(问题规模缩小); // 递归 调用 return 各子问题合并后的解;
  • 24. 《数据结构( Java 版)(第 3 版)》 深度优先搜索遍历二叉树、树和图,以及折 半查找、快速排序都是采用分治策略的算法。 void 遍历(问题规模) { if (问题规模 >1 ) // 继续递归 { 访问当前元素; while (存在子问题) // 分解成若干子 问题 遍历(子问题规模); // 递归调 用
  • 25. 《数据结构( Java 版)(第 3 版)》 10.3.2 动态规划法 1. 动态规划 动态规划法( dynamic programming )也 是把一个大问题分解为若干较小的子问题 ,通过求解子问题而得到原问题的解。动 态规划法采用备忘录做法。 1. 动态规划法的基本要素 a. 最优子结构 b. 子问题重叠 n
  • 26. 《数据结构( Java 版)(第 3 版)》 【例 10.2 】 动态规划法求组合 数。    >>+= >=== − − − 0 0,01 1 1 1 nmCCC mnmnC n m n m n m n m 或 n n m 0 1 2 3 4 5 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1
  • 27. 《数据结构( Java 版)(第 3 版)》 10.3.3 贪心法 63.6 元 = 10 元 ×6+1 元 ×3+0.1 元 ×6 //15 张 63.6 = 50+10+2+1+0.5+0.1 //6 张(个) 1. 贪心选择策略 贪心法( greedy )是运用局部最优选择以期 获得全局最优解的一种策略。
  • 28. 《数据结构( Java 版)(第 3 版)》 【例 10.3 】 贪心法求解背包问题 。 给定 n 个物品和一个背包,物品 i 的重量为 wi ,价值为 pi ,背包能容纳物品总重量为 W ;设 xi ( 0≤ xi ≤1 )表示物品 i 的几分 之几,求如何选择装入背包的物品(全部 或部分),使背包中物品总价值 最大。 背包问题的约束条件为 ≤ W ,满 足约束条件的 n 元组 是一个 ∑= n i ii xp 1 )( ∑= n i ii xw 1 )( ),,,( 21 nxxx  ∑= n i ii xp 1 )(
  • 29. 《数据结构( Java 版)(第 3 版)》 表 10-2 背包问题的多个可 用解 n=3 ,物品 序列为 {(80,20),(50,25), (15,45)} , W=100 。 ),,( 321 xxx ∑= 3 1 )( i ii xw )( 3 1 ∑=i ii xp 方 案 可用解 背包重量 背包价值 1 (1, 20/50, 0) 80+20=100 20+25*2/5=30 2 (1, 5/50, 1) 80+5=15=100 20+25*5/50+45 =67.5 3 (50/80, 1, 0) 50+50=100 20*50/80+25=37.5 4 (35/80, 1, 1) 35+50+15=100 20*35/80+25+45 =78.75 ),( ii pw
  • 30. 《数据结构( Java 版)(第 3 版)》 10.3.3 贪心法 2. 贪心法的基本要素 a. 贪心选择性质 b. 最优子结构性质 2. 贪心法与动态规划法的区别
  • 31. 《数据结构( Java 版)(第 3 版)》 4. 最小堆 贪心选择策略最简单的应用是求最小值。 public class MinHeap<T extends java.lang.Comparable<T>>// 最小堆类 { Comparable [] element;// 最小堆元素数 组 int len; // 最小堆元素 个数 Comparator comparator=null; // 比较
  • 32. 《数据结构( Java 版)(第 3 版)》 图 10-6 最小堆插入和删除元 素
  • 33. 《数据结构( Java 版)(第 3 版)》 5. 贪心策略应用 Prim 算法
  • 34. 《数据结构( Java 版)(第 3 版)》 Dijkstra 算法采用贪 心 选择策略逐步扩 充顶点 A 的单源最短路 径
  • 35. 《数据结构( Java 版)(第 3 版)》 Huffman 算法采用贪心选择策 略 逐步合并森林构造 Huffman 树
  • 36. 《数据结构( Java 版)(第 3 版)》 6. Kruskal 算法实现
  • 37. 《数据结构( Java 版)(第 3 版)》 ( 1 )最小生成树类 public class MinSpanTree { Edge[] mst; // 边集合 int cost=0; // 代价 public MinSpanTree(int n, Edge[] edges, Comparator<Edge> comparator) { MinHeap<Edge> minheap = new MinHeap<Edge>(edges, comparator); ……
  • 38. 《数据结构( Java 版)(第 3 版)》 例 10.4 以 Kruskal 算法构 造带权无向图的最小生成树。 图 10-10 的所有边按权值构造的最小堆
  • 39. 《数据结构( Java 版)(第 3 版)》 ( 2 )并查集类
  • 40. 《数据结构( Java 版)(第 3 版)》 ( 2 )并查集类
  • 41. 《数据结构( Java 版)(第 3 版)》 图 10-13 查找集合元素时采 用折叠规则压缩路径
  • 42. 《数据结构( Java 版)(第 3 版)》 10.3.4 回溯法 回溯法( backtracking )在问题的解 空间中,以深度优先策略搜索满足约束条件 的一个解或所有解。二叉树、树和图的深度 优先搜索遍历算法采用的是回溯法。 用回溯法解题通常包含以下三个步骤: <1> 定义所求问题的解空间。 <2> 构造易于搜索的解空间结构。 <3> 以深度优先方式搜索解空间,并在搜索 过程中用剪枝函数避免无效搜索。
  • 43. 《数据结构( Java 版)(第 3 版)》 1. 问题的解空间及解空间 树 0-1 背包问题( n=3 )解空间是 {(0,0,0) , (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1)} 图 10-14 0-1 背包问题的解空间二叉树
  • 44. 《数据结构( Java 版)(第 3 版)》 图 10-15 穷举法求解 0-1 背包 问题
  • 45. 《数据结构( Java 版)(第 3 版)》 2. 约束集的完备性 若一个 i ( 1≤i≤n )元组 违反涉及到 元素的一个约束条件,则以 为前缀的任何 n 元组 一定也违反相应的约束条件。 ),,,( 110 −ixxx  110 ,,, −ixxx  ),,,( 110 −ixxx  ),,,,,( 1110 −− ni xxxx 
  • 46. 《数据结构( Java 版)(第 3 版)》 3. 回溯策略 1. 深度优先搜索 2. 剪枝:约束剪枝,限界剪枝 3. 递归回溯与迭代回溯
  • 47. 《数据结构( Java 版)(第 3 版)》 0-1 背包问题按背包重量的约 束剪枝
  • 48. 《数据结构( Java 版)(第 3 版)》 0-1 背包问题按背包重量的 限界剪枝
  • 49. 《数据结构( Java 版)(第 3 版)》 例 10.5 回溯法求解 0-1 背包问 题。 1. 物品按重量降序排列 2. 物品按单位重量价值降序排列 图 10-18 0-1 背包问题物品按单位重量价值降序排列的解空 间树
  • 50. 《数据结构( Java 版)(第 3 版)》 【例 10.6 】 回溯法求解八皇后问 题。 a.八皇后问题的解空间 八皇后问题的显约束是 ( 0≤i≤7 ),解空间由 个 8 元组构成,范围是 (0,0,0,0,0,0,0,0) ~ (7,7,7,7,7,7,7,7) ,解空间树 是一棵满八叉树。隐约束是任意两个皇后不在同一 列或同一斜线上。 8 8 }7,,1,0{ =∈ ii Sx
  • 51. 《数据结构( Java 版)(第 3 版)》 ② 用回溯法求解四皇后问题 的解空间树
  • 52. 《数据结构( Java 版)(第 3 版)》 ③ 判断隐约束条件  任意两个皇后不在同一列上。若 i≠j , 有 。意为元素各不相同,确定 (0,0,?,?) 等不是解。  任意两个皇后不在同一斜线上。若 i≠j ,有 。由此约束确定 (0,1,?,?) 、 (0,2,1,?) 、 (0,3,1,0) 等 不是解。 ji xx ≠ jixx ji −≠−
  • 53. 《数据结构( Java 版)(第 3 版)》 1. 用回溯法求解八皇后问题程序 2. 迭代回溯
  • 54. 《数据结构( Java 版)(第 3 版)》 【例 10.7 】 预见算法解骑士游历问 题。 1. 骑士游历问题的解 空间    = 马到达该格的步数自然数 马未到达过0 xyc 一次不成功游历路径
  • 55. 《数据结构( Java 版)(第 3 版)》 ② 预见算法 方向 下一位置 可通方向 可通路数 1 (2,4) 1,2,3,4,6,7,8 7 2 (3,5) 1,2,3,4,5,7,8 7 3 (5,5) 1,2,3,4,5,6,8 7 4 (6,4) 1,2,3,6,7 5 5 (6,2) 2,3,6,7,8 5 6 (5,1) 1,3,4,5,8 5 7 (3,1) 1,2,4,5,8 5 8 (2,2) 1,2,3,5,6,7,8 7
  • 56. 《数据结构( Java 版)(第 3 版)》 骑士游历算法流程
  • 57. 《数据结构( Java 版)(第 3 版)》 10.4 课程设计的目的、 要求和选题 数据结构课程设计的目的是,深入理解 数据结构的基本理论,掌握对数据结构各 种操作的算法设计方法,增强对基础知识 和基本方法的综合运用能力,增强对算法 的理解能力,提高软件设计能力,在实践 中培养独立分析问题和解决问题的作风和 能力。
  • 58. 《数据结构( Java 版)(第 3 版)》 数据结构课程设计的要求 综合运用数据结构的基础知识和算法设计 的基本原则,独立编制一个具有中等规模的 、一定难度的、解决实际问题的应用程序; 通过题意分析、选择数据结构、算法设计、 编制程序、调试程序、软件测试、结果分析 、撰写课程设计报告等环节完成软件设计的 全过程,完善算法并提高程序性能。
  • 59. 《数据结构( Java 版)(第 3 版)》 具体要求 a. 选题与数据结构课程内容相关,体现基本的数 据结构和算法设计原则。 b. 算法有明确的思路,模块结构合理,表述清楚 ,算法完整,考虑各种可能情况。 c. 采用 Java 语言和面向对象程序设计思想实现 。 d. 程序必须运行通过,对于各种输入数据,有明 确的不同的输出结果。程序运行有错误时,必 须采取各种调试手段排除错误。
  • 60. 《数据结构( Java 版)(第 3 版)》 ⑤ 课程设计报告 包括:课程设计目的、题目说明、题 意分析、设计方案、功能说明、实现 技术和手段、程序流程、源程序清单 、运行结果及结果分析、设计经验和 教训总结、存在问题及解决方案等。