SlideShare ist ein Scribd-Unternehmen logo
1 von 43
叶核亚
数据结构( Java
版)
(第 3 版)
数据结构( Java 版)(第 3
版)
 第 1 章 绪论
 第 2 章 线性表
 第 3 章 串
 第 4 章 栈与队列
 第 5 章 数组和广义表
 第 6 章 树和二叉树
 第 7 章 图
 第 8 章 查找
 第 9 章 排序
 第 10 章 综合应用设计
《数据结构( Java 版)(第 3 版)》
第 1 章 绪论
 1.1 数据结构的基本概念
 1.2 算法
 1.3 Java开发运行环境
《数据结构( Java 版)(第 3 版)》
目的和要求
 目的:勾勒数据结构课程的轮廓。
 内容:数据结构概念,算法设计与分析。
 要求:理解数据结构基本概念,理解抽象数
据 类型概念;熟悉算法设计和分析方法。
掌 握编辑、编译、运行 Java Application
程 序的基本技能。
 重点:数据的逻辑结构和存储结构概念。
 难点:抽象数据类型,算法分析。
 实验:简单算法设计,回顾 Java++ 语言的
基本 语法和面向对象基本概念。
《数据结构( Java 版)(第 3 版)》
1.1 数据结构的基本概念
1.1.1 为什么要学习数据结构
1.1.2 什么是数据结构
1.1.3 数据类型与抽象数据类型
《数据结构( Java 版)(第 3 版)》
1.1.1 为什么要学习数据
结构
 软件设计是计算机学科各个领域的核心。
软件设计时要考虑的首要问题是数据的
表示、组织和处理方法。数据结构设计
和算法设计是软件系统设计的核心。
 “ 数据结构十算法 = 程序”。
《数据结构( Java 版)(第 3 版)》
1.1.2 什么是数据结
构
1. 数据( data ) 、数据元素( data
element ) 、数据项( data
item ) 。
2. 数据结构( data structure )指数
据元素之间存在的关系。
《数据结构( Java 版)(第 3 版)》
1. 数据的逻辑结构
( 1 )线性结构:数据元素只有一个前驱数据元素和一
个后继数据元素。
( 2 )树结构:每个数据元素只有一个前驱数据元素,
可有零个或若干个后继数据元素。
( 3 )图结构:每个数据元素可有零个或若干个前驱数
据元素,零个或若干个后继数据元素。
《数据结构( Java 版)(第 3 版)》
( 1 )线性结构
学 号 姓 名 年 龄
20020001 王红 18
20020002 张明 19
20020003 吴宁 18
20020004 秦风 17
表 1-1 学生信息表
( 2 )树结
构
《数据结构( Java 版)(第 3 版)》
( 3 )图结构
图 1-3  南京飞往昆明的航班路线
图
《数据结构( Java 版)(第 3 版)》
2. 数据的存储结构
( 1 )顺序存储结构
( 2 )链式存储结构
《数据结构( Java 版)(第 3 版)》
3. 数据操作
1. 初始化。
2. 判断是否空状态。
3. 求长度:统计元素个数。
4. 包含:判断是否包含指定元素。
5. 遍历:按某种次序访问所有元素,每个元
素只被访问一次。
6. 取值:获取指定元素值。
7. 置值:设置指定元素值。
8. 插入:增加指定元素。
9. 删除:移去指定元素。
《数据结构( Java 版)(第 3 版)》
1.1.3 数据类型与抽象数据类
型
1. 数据类型( data type )是指一个类型和
定义在这个类型上的操作集合。
2. 抽象数据类型( Abstract Data Type ,
ADT )是指一个逻辑概念上的类型和这
个类型上的操作集合。
《数据结构( Java 版)(第 3 版)》
复数抽象数据类型
ADT Complex
{
double real,imag; // 实部和
虚部
Complex(real,imag);
Complex add(Complex c); // 加
法
Complex sub(Complex c); // 减
法
ADT Set
{ 数据:集合中有 n ( n≥0 )个数据元素,元素类型
为 T
操作:
boolean isEmpty(); // 判断集合是否为空
int size (); // 返回集合的元素
个数
boolean contains(T x); // 判断集合是否包含元
素 x
boolean add(T x); // 增加元素 x
boolean remove(T x); // 删除首次出现的元素
x
void clear(); // 删除集合所有元素
void print(); // 输出集合中所有元
素
boolean equals(Set s); // 比较集合是否相等
boolean containsAll(Set s);
// 判断是否包含 s 中的所有元素, s 是
否子集
《数据结构( Java 版)(第 3 版)》
1.1.6 用 Java 语言描述数据
结构
public interface SSet<T>
{ // 集合接口, T 是泛型参数,指定元
素类型
boolean isEmpty(); // 判断集合是否为空
int size(); // 返回集合的元素个数
String toString(); // 返回集合元素的描述字符
串
T search(T key); // 查找,返回关键字为
key 元素
boolean contain(T x); // 判断集合是否包含元素 x
void add(T x); // 增加元素 x
《数据结构( Java 版)(第 3 版)》
1.2 算法
1.2.1 什么是算法
1.2.2 算法分析
1.2.3 算法设计
《数据结构( Java 版)(第 3 版)》
1.2.1 什么是算法
1. 算法定义
a. 有穷性
b. 确定性
c. 输入
d. 输出
e. 可行性
2. 算法设计目标
a. 正确性
b. 可读性
c. 健壮性
d. 高时间效率
e. 高空间效率
《数据结构( Java 版)(第 3 版)》
3. 算法描述
元素 search( 关键字 key)
{
e = 数据序列的第一个元素 ;
while ( 数据序列未结束 && e 的关键字不是
key)
e = 数据序列的下一个元素 ;
返回查找到的元素或查找不成功标记 ;
}
《数据结构( Java 版)(第 3 版)》
4. 算法与数据结构
图 1-6 线性表插入操作
《数据结构( Java 版)(第 3 版)》
1.2.2 算法分析
1.度量算法的时间效率
算法的时间效率指算法的执行时间随问题规模
的增长而增长的趋势,通常采用时间复杂度来度
量算法的时间效率。
T(n)=O(f(n))
2.度量算法的空间效率
空间复杂度指算法在执行时为解决问题所需要
的额外内存空间,不包括输入数据所占用的存储
空间。
S(n)=O(f(n))
《数据结构( Java 版)(第 3 版)》
表 1-2 时间复杂度随 n 变
化情况的比较
时间复杂
度
n=8(23
) n=10 n=100 n=1000
O(1) 1 1 1 1
O(log2
n) 3 3.322 6.644 9.966
O(n) 8 10 100 1000
O(nlog2
n) 24 33.22 664.4 9966
O(n2
) 64 100 10000 106
《数据结构( Java 版)(第 3 版)》
1. 一个简单语句的时间复杂度为 O(1) 。
int count=0;
1. 一个循环的时间复杂度为 O(n) 。
int n=8, count=0;
for (int i=1; i<=n; i++)
count++;
1. 时间复杂度为 O(log2 n) 的循环语句。
int n=8, count=0;
for (int i=1; i<=n; i*=2)
count++;
1. 时间复杂度为 O(n2
) 的二重循环。
int n=8, count=0;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
count++;
《数据结构( Java 版)(第 3 版)》
【例 1.1 】 算法时间复杂度分
析。
5. 时间复杂度为 O(nlog2n) 的二重循环。
int n=8, count=0;
for (int i=1; i<=n; i*=2)
for (int j=1; j<=n; j++)
count++;
循环次数为 。时间复杂度为
O(nlog2n) 。
6. 时间复杂度为 O(n) 的二重循环。
int n=8, count=0;
for (int i=1; i<=n; i*=2)
for (int j=1; j<=i; j++)
count++; )(2
2log
1
nO
n
i
i
=∑=
)log( 2
log
1
2
nnOn
n
i
=∑=
《数据结构( Java 版)(第 3 版)》
1.2.3 算法设计
【例 1.2 】求两个整数的最大公约
数。
说明算法的必要性。
① 质因数分解法。已知
则
② 更相减损术。
(91,49)=(42,49)=(42,7)=7
③ 欧几里德( Euclid )的
辗转相除法。
232
753226460 ×××=
115312375 32
××=
4553)12375,26460( 2
=×=最大公约数
《数据结构( Java 版)(第 3 版)》
【例 1.3 】数组的顺序查找算
法。
a. 基本数据类型数组的顺序查找算法实现
b. 对象数组的顺序查找算法实现
public class Object
{
// 比较当前对象与 obj 是否相等
public boolean equals(Object obj)
{ return (this == obj);
// 若两个对象引用同一个实例,返回
true
}
}
《数据结构( Java 版)(第 3 版)》
public final class Integer extends Number
implements Comparable<Integer>
{
private final int value;
public boolean equals(Object obj)
{ // 覆盖 Object 类中方
法
if (obj instanceof Integer)
return value ==
((Integer)obj).intValue();
// 比较两个 Integer 对象
的值
return false;
}
《数据结构( Java 版)(第 3 版)》
③ 理解数组的动态特性和引用模
型
图 1-7 一维数组的引用模型
《数据结构( Java 版)(第 3 版)》
public static void swap(Object[] value, int i, int
j) // 交换下标为 i 、 j 的两个数组元
素
{
if (i!=j) // 若 i 、 j 超出 0 ~
value.length-1 范围,将抛出数组下标越界异常
{ Object temp = value[j];
value[j] = value[i];
value[i] = temp;
}
}
《数据结构( Java 版)(第 3 版)》
public static int[] concat(int x[], int y[]) //
合并数组 x 和 y 中的元素,返回新创建的数组
{
int i, temp[] = new int[x.length+y.length];
for (i=0; i<x.length; i++)
temp[i] = x[i];
for (int j=0; j<y.length; j++)
temp[i+j] = y[j];
return temp;
}
《数据结构( Java 版)(第 3 版)》
④ 理解运行时多态性
Object obj=new Integer(123);
// 父类对象 obj 引用子类 Integer 实例
System.out.println(obj.toString()); // 运行时多
态性,执行子类 Integer 的 toString() 方法
obj=new String("123");
System.out.println(obj.toString());
public static void print(Object[] value)
public static int indexOf(Object[] value,
Object key)
《数据结构( Java 版)(第 3 版)》
【例 1.4 】排序数组的顺序查
找算法。
① 对基本数据类型的排序数组进行顺序查找
Java 定义 < 、 <= 、 > 、 >= 关系运算符比较两
个基本数据类型数据值的大小。
② 对引用数据类型的排序数组进行顺序查找
对 象 用 Comparable 接 口 中 的 compareTo() 方
法比较大小。
public interface Comparable<T>// 可比较接口
{
int compareTo(T obj)// 约定比较对象大小的规
则
}
《数据结构( Java 版)(第 3 版)》
public final class Integer extends Number
implements Comparable<Integer>
{
public int compareTo(Integer iobj)
// 比较两个对象值大小,返回 -1 、 0 或 1
{
return (this.value < iobj.value? -1 :
(this.value== iobj.value ? 0:1));
}
}
《数据结构( Java 版)(第 3 版)》
public final class String extends Object
implements Serializable,
Comparable<String>, CharSequence
{
public int compareTo(String s)
// 比较字符串的大小,实现 Comparable 接口
public int compareToIgnoreCase(String s)
// 比较字符串的大小,忽略字母大小写
}
《数据结构( Java 版)(第 3 版)》
例 1.5 判断给定字符串是否为
Java 关键字。
《数据结构( Java 版)(第 3 版)》
例 1.6 排序算法及其必要
性。
1. 排序算法的必要
性
2. 直接插入排序
3. 直接选择排序
《数据结构( Java 版)(第 3 版)》
1.3.1 JDK
1.3.2 MyEclipse
要求:掌握编辑、编译、运行 Java
Application 程序的基本技能。
重点:编辑、编译、运行 Java 程序。
难点:包, MyEclipse 的项目、工作区,
程序调试技术。
1.3 Java 开发运行环
境
《数据结构( Java 版)(第 3 版)》
1.3.1 JDK
1. 安装 JDK
2. 设置环境变量
a. 在 Windows XP 中设置环境变量
b. 设置环境变量的批命令
3. 编译和运行 Java 程序
a. 执行批命令设置环境变量
b. 编译
c. 运行 Application 应用程序
d. 命令行参数
《数据结构( Java 版)(第 3 版)》
4. 包
( 1 ) 包的概念
( 2 ) Java API 的常用包
( 3 ) 引用包中的类
( 4 ) 查看 Java API
( 5 ) 查看 Java API 源程序及包等级
( 6 ) 导入包
( 7 ) 声明类所在的包
【例 1.7 】 创建及使用 dataStructure
包。
( 8 ) 默认包路径
( 9 ) Java 源程序结构
( 10 ) 包可以压缩成 jar 文件
《数据结构( Java 版)(第 3 版)》
1.3.2 MyEclipse
1. MyEclipse 集成开发环境
( 1 ) 安装 MyEclipse 并启动
( 2 ) 界面
( 3 ) 代码提示和源代码查看
( 4 ) 项目和工作区
《数据结构( Java 版)(第 3 版)》
2. 创建 Java 项目并运行
( 1 ) 新建 Java 项目
( 2 ) 新建 Java 类
( 3 ) 编辑、编译和运行
( 4 ) 重构
( 5 ) 切换工作区
( 6 ) 访问其他项目中的类和添加
JAR 包
( 7 ) 选择运行的类和设置命令行参
《数据结构( Java 版)(第 3 版)》
3. 程序调试技术
1. 程序错误、发现时刻及错误处理原
则
语法错、语义错、逻辑错
1. 程序运行方式
a. 正常运行
b. 单步运行
c. 分段运行
3. 调试过程
a. 设置断点
b. 调试界面
c. 单步或分段运行
d. 查看变量的当前值

Weitere ähnliche Inhalte

Was ist angesagt?

《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
jane2006
 
Java考试试题
Java考试试题Java考试试题
Java考试试题
yiditushe
 
Hibernate的高级操作
Hibernate的高级操作Hibernate的高级操作
Hibernate的高级操作
yiditushe
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)
Chris Huang
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)
Yan Li
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法
yiditushe
 
7 第七章 学习与进化模型ann
7 第七章 学习与进化模型ann7 第七章 学习与进化模型ann
7 第七章 学习与进化模型ann
zhang shuren
 
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
shademoon
 

Was ist angesagt? (20)

Sun java
Sun javaSun java
Sun java
 
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
 
Python程式設計 - 串列資料應用
Python程式設計 - 串列資料應用 Python程式設計 - 串列資料應用
Python程式設計 - 串列資料應用
 
Python程式設計 - 迴圈作業
Python程式設計 - 迴圈作業Python程式設計 - 迴圈作業
Python程式設計 - 迴圈作業
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
 
Scala再探
Scala再探Scala再探
Scala再探
 
Python串列資料應用
Python串列資料應用Python串列資料應用
Python串列資料應用
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
Python基本資料運算
Python基本資料運算Python基本資料運算
Python基本資料運算
 
Java考试试题
Java考试试题Java考试试题
Java考试试题
 
Python程式設計 - 分支作業
Python程式設計 - 分支作業Python程式設計 - 分支作業
Python程式設計 - 分支作業
 
Python分支作業
Python分支作業Python分支作業
Python分支作業
 
Hibernate的高级操作
Hibernate的高级操作Hibernate的高级操作
Hibernate的高级操作
 
Sql培训 (1)
Sql培训 (1)Sql培训 (1)
Sql培训 (1)
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法
 
7 第七章 学习与进化模型ann
7 第七章 学习与进化模型ann7 第七章 学习与进化模型ann
7 第七章 学习与进化模型ann
 
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
 

Ähnlich wie 第01章 绪论(java版)

Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
yiditushe
 
07 陣列與字串
07 陣列與字串07 陣列與字串
07 陣列與字串
shademoon
 
Js is js(程劭非) (1)
Js is js(程劭非) (1)Js is js(程劭非) (1)
Js is js(程劭非) (1)
looneyren
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
yiditushe
 
第07章 图(java版)
第07章  图(java版)第07章  图(java版)
第07章 图(java版)
Yan Li
 
Java面试知识
Java面试知识Java面试知识
Java面试知识
yiditushe
 

Ähnlich wie 第01章 绪论(java版) (20)

香港六合彩
香港六合彩香港六合彩
香港六合彩
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
07 陣列與字串
07 陣列與字串07 陣列與字串
07 陣列與字串
 
Js is js(程劭非) (1)
Js is js(程劭非) (1)Js is js(程劭非) (1)
Js is js(程劭非) (1)
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
chapter 1 basic knowledge about python.ppt
chapter 1 basic knowledge about python.pptchapter 1 basic knowledge about python.ppt
chapter 1 basic knowledge about python.ppt
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
 
Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援Spring 2.0 技術手冊第五章 - JDBC、交易支援
Spring 2.0 技術手冊第五章 - JDBC、交易支援
 
Row Set初步学习V1.1
Row Set初步学习V1.1Row Set初步学习V1.1
Row Set初步学习V1.1
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
 
Python元組,字典,集合
Python元組,字典,集合Python元組,字典,集合
Python元組,字典,集合
 
Scala
ScalaScala
Scala
 
第07章 图(java版)
第07章  图(java版)第07章  图(java版)
第07章 图(java版)
 
快速了解PostgreSQL
快速了解PostgreSQL快速了解PostgreSQL
快速了解PostgreSQL
 
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社
数据结构(用面向对象方法与C++语言描述第二版)殷人昆编著清华大学出版社
 
JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1
 
第5章数组
第5章数组第5章数组
第5章数组
 
Java面试知识
Java面试知识Java面试知识
Java面试知识
 
数据结构回顾
数据结构回顾数据结构回顾
数据结构回顾
 

Mehr von Yan Li

Chapter 01 essentials final
Chapter 01 essentials finalChapter 01 essentials final
Chapter 01 essentials final
Yan Li
 
Chapter 05 essentials final
Chapter 05 essentials finalChapter 05 essentials final
Chapter 05 essentials final
Yan Li
 
Chapter 04 essentials final
Chapter 04 essentials finalChapter 04 essentials final
Chapter 04 essentials final
Yan Li
 
Chapter 02 essentials final
Chapter 02 essentials finalChapter 02 essentials final
Chapter 02 essentials final
Yan Li
 
Chapter 03 essentials final
Chapter 03 essentials finalChapter 03 essentials final
Chapter 03 essentials final
Yan Li
 
第09章 排序(java版)
第09章  排序(java版)第09章  排序(java版)
第09章 排序(java版)
Yan Li
 
第08章 查找(java版)
第08章  查找(java版)第08章  查找(java版)
第08章 查找(java版)
Yan Li
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)
Yan Li
 
第05章 数组和广义表(java版)
第05章  数组和广义表(java版)第05章  数组和广义表(java版)
第05章 数组和广义表(java版)
Yan Li
 
第04章 栈和队列(java版)
第04章  栈和队列(java版)第04章  栈和队列(java版)
第04章 栈和队列(java版)
Yan Li
 
第03章 串(java版)
第03章  串(java版)第03章  串(java版)
第03章 串(java版)
Yan Li
 

Mehr von Yan Li (12)

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版)
 
第08章 查找(java版)
第08章  查找(java版)第08章  查找(java版)
第08章 查找(java版)
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)
 
第05章 数组和广义表(java版)
第05章  数组和广义表(java版)第05章  数组和广义表(java版)
第05章 数组和广义表(java版)
 
第04章 栈和队列(java版)
第04章  栈和队列(java版)第04章  栈和队列(java版)
第04章 栈和队列(java版)
 
第03章 串(java版)
第03章  串(java版)第03章  串(java版)
第03章 串(java版)
 

第01章 绪论(java版)

  • 2. 数据结构( Java 版)(第 3 版)  第 1 章 绪论  第 2 章 线性表  第 3 章 串  第 4 章 栈与队列  第 5 章 数组和广义表  第 6 章 树和二叉树  第 7 章 图  第 8 章 查找  第 9 章 排序  第 10 章 综合应用设计
  • 3. 《数据结构( Java 版)(第 3 版)》 第 1 章 绪论  1.1 数据结构的基本概念  1.2 算法  1.3 Java开发运行环境
  • 4. 《数据结构( Java 版)(第 3 版)》 目的和要求  目的:勾勒数据结构课程的轮廓。  内容:数据结构概念,算法设计与分析。  要求:理解数据结构基本概念,理解抽象数 据 类型概念;熟悉算法设计和分析方法。 掌 握编辑、编译、运行 Java Application 程 序的基本技能。  重点:数据的逻辑结构和存储结构概念。  难点:抽象数据类型,算法分析。  实验:简单算法设计,回顾 Java++ 语言的 基本 语法和面向对象基本概念。
  • 5. 《数据结构( Java 版)(第 3 版)》 1.1 数据结构的基本概念 1.1.1 为什么要学习数据结构 1.1.2 什么是数据结构 1.1.3 数据类型与抽象数据类型
  • 6. 《数据结构( Java 版)(第 3 版)》 1.1.1 为什么要学习数据 结构  软件设计是计算机学科各个领域的核心。 软件设计时要考虑的首要问题是数据的 表示、组织和处理方法。数据结构设计 和算法设计是软件系统设计的核心。  “ 数据结构十算法 = 程序”。
  • 7. 《数据结构( Java 版)(第 3 版)》 1.1.2 什么是数据结 构 1. 数据( data ) 、数据元素( data element ) 、数据项( data item ) 。 2. 数据结构( data structure )指数 据元素之间存在的关系。
  • 8. 《数据结构( Java 版)(第 3 版)》 1. 数据的逻辑结构 ( 1 )线性结构:数据元素只有一个前驱数据元素和一 个后继数据元素。 ( 2 )树结构:每个数据元素只有一个前驱数据元素, 可有零个或若干个后继数据元素。 ( 3 )图结构:每个数据元素可有零个或若干个前驱数 据元素,零个或若干个后继数据元素。
  • 9. 《数据结构( Java 版)(第 3 版)》 ( 1 )线性结构 学 号 姓 名 年 龄 20020001 王红 18 20020002 张明 19 20020003 吴宁 18 20020004 秦风 17 表 1-1 学生信息表
  • 11. 《数据结构( Java 版)(第 3 版)》 ( 3 )图结构 图 1-3  南京飞往昆明的航班路线 图
  • 12. 《数据结构( Java 版)(第 3 版)》 2. 数据的存储结构 ( 1 )顺序存储结构 ( 2 )链式存储结构
  • 13. 《数据结构( Java 版)(第 3 版)》 3. 数据操作 1. 初始化。 2. 判断是否空状态。 3. 求长度:统计元素个数。 4. 包含:判断是否包含指定元素。 5. 遍历:按某种次序访问所有元素,每个元 素只被访问一次。 6. 取值:获取指定元素值。 7. 置值:设置指定元素值。 8. 插入:增加指定元素。 9. 删除:移去指定元素。
  • 14. 《数据结构( Java 版)(第 3 版)》 1.1.3 数据类型与抽象数据类 型 1. 数据类型( data type )是指一个类型和 定义在这个类型上的操作集合。 2. 抽象数据类型( Abstract Data Type , ADT )是指一个逻辑概念上的类型和这 个类型上的操作集合。
  • 15. 《数据结构( Java 版)(第 3 版)》 复数抽象数据类型 ADT Complex { double real,imag; // 实部和 虚部 Complex(real,imag); Complex add(Complex c); // 加 法 Complex sub(Complex c); // 减 法
  • 16. ADT Set { 数据:集合中有 n ( n≥0 )个数据元素,元素类型 为 T 操作: boolean isEmpty(); // 判断集合是否为空 int size (); // 返回集合的元素 个数 boolean contains(T x); // 判断集合是否包含元 素 x boolean add(T x); // 增加元素 x boolean remove(T x); // 删除首次出现的元素 x void clear(); // 删除集合所有元素 void print(); // 输出集合中所有元 素 boolean equals(Set s); // 比较集合是否相等 boolean containsAll(Set s); // 判断是否包含 s 中的所有元素, s 是 否子集
  • 17. 《数据结构( Java 版)(第 3 版)》 1.1.6 用 Java 语言描述数据 结构 public interface SSet<T> { // 集合接口, T 是泛型参数,指定元 素类型 boolean isEmpty(); // 判断集合是否为空 int size(); // 返回集合的元素个数 String toString(); // 返回集合元素的描述字符 串 T search(T key); // 查找,返回关键字为 key 元素 boolean contain(T x); // 判断集合是否包含元素 x void add(T x); // 增加元素 x
  • 18. 《数据结构( Java 版)(第 3 版)》 1.2 算法 1.2.1 什么是算法 1.2.2 算法分析 1.2.3 算法设计
  • 19. 《数据结构( Java 版)(第 3 版)》 1.2.1 什么是算法 1. 算法定义 a. 有穷性 b. 确定性 c. 输入 d. 输出 e. 可行性 2. 算法设计目标 a. 正确性 b. 可读性 c. 健壮性 d. 高时间效率 e. 高空间效率
  • 20. 《数据结构( Java 版)(第 3 版)》 3. 算法描述 元素 search( 关键字 key) { e = 数据序列的第一个元素 ; while ( 数据序列未结束 && e 的关键字不是 key) e = 数据序列的下一个元素 ; 返回查找到的元素或查找不成功标记 ; }
  • 21. 《数据结构( Java 版)(第 3 版)》 4. 算法与数据结构 图 1-6 线性表插入操作
  • 22. 《数据结构( Java 版)(第 3 版)》 1.2.2 算法分析 1.度量算法的时间效率 算法的时间效率指算法的执行时间随问题规模 的增长而增长的趋势,通常采用时间复杂度来度 量算法的时间效率。 T(n)=O(f(n)) 2.度量算法的空间效率 空间复杂度指算法在执行时为解决问题所需要 的额外内存空间,不包括输入数据所占用的存储 空间。 S(n)=O(f(n))
  • 23. 《数据结构( Java 版)(第 3 版)》 表 1-2 时间复杂度随 n 变 化情况的比较 时间复杂 度 n=8(23 ) n=10 n=100 n=1000 O(1) 1 1 1 1 O(log2 n) 3 3.322 6.644 9.966 O(n) 8 10 100 1000 O(nlog2 n) 24 33.22 664.4 9966 O(n2 ) 64 100 10000 106
  • 24. 《数据结构( Java 版)(第 3 版)》 1. 一个简单语句的时间复杂度为 O(1) 。 int count=0; 1. 一个循环的时间复杂度为 O(n) 。 int n=8, count=0; for (int i=1; i<=n; i++) count++; 1. 时间复杂度为 O(log2 n) 的循环语句。 int n=8, count=0; for (int i=1; i<=n; i*=2) count++; 1. 时间复杂度为 O(n2 ) 的二重循环。 int n=8, count=0; for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) count++;
  • 25. 《数据结构( Java 版)(第 3 版)》 【例 1.1 】 算法时间复杂度分 析。 5. 时间复杂度为 O(nlog2n) 的二重循环。 int n=8, count=0; for (int i=1; i<=n; i*=2) for (int j=1; j<=n; j++) count++; 循环次数为 。时间复杂度为 O(nlog2n) 。 6. 时间复杂度为 O(n) 的二重循环。 int n=8, count=0; for (int i=1; i<=n; i*=2) for (int j=1; j<=i; j++) count++; )(2 2log 1 nO n i i =∑= )log( 2 log 1 2 nnOn n i =∑=
  • 26. 《数据结构( Java 版)(第 3 版)》 1.2.3 算法设计 【例 1.2 】求两个整数的最大公约 数。 说明算法的必要性。 ① 质因数分解法。已知 则 ② 更相减损术。 (91,49)=(42,49)=(42,7)=7 ③ 欧几里德( Euclid )的 辗转相除法。 232 753226460 ×××= 115312375 32 ××= 4553)12375,26460( 2 =×=最大公约数
  • 27. 《数据结构( Java 版)(第 3 版)》 【例 1.3 】数组的顺序查找算 法。 a. 基本数据类型数组的顺序查找算法实现 b. 对象数组的顺序查找算法实现 public class Object { // 比较当前对象与 obj 是否相等 public boolean equals(Object obj) { return (this == obj); // 若两个对象引用同一个实例,返回 true } }
  • 28. 《数据结构( Java 版)(第 3 版)》 public final class Integer extends Number implements Comparable<Integer> { private final int value; public boolean equals(Object obj) { // 覆盖 Object 类中方 法 if (obj instanceof Integer) return value == ((Integer)obj).intValue(); // 比较两个 Integer 对象 的值 return false; }
  • 29. 《数据结构( Java 版)(第 3 版)》 ③ 理解数组的动态特性和引用模 型 图 1-7 一维数组的引用模型
  • 30. 《数据结构( Java 版)(第 3 版)》 public static void swap(Object[] value, int i, int j) // 交换下标为 i 、 j 的两个数组元 素 { if (i!=j) // 若 i 、 j 超出 0 ~ value.length-1 范围,将抛出数组下标越界异常 { Object temp = value[j]; value[j] = value[i]; value[i] = temp; } }
  • 31. 《数据结构( Java 版)(第 3 版)》 public static int[] concat(int x[], int y[]) // 合并数组 x 和 y 中的元素,返回新创建的数组 { int i, temp[] = new int[x.length+y.length]; for (i=0; i<x.length; i++) temp[i] = x[i]; for (int j=0; j<y.length; j++) temp[i+j] = y[j]; return temp; }
  • 32. 《数据结构( Java 版)(第 3 版)》 ④ 理解运行时多态性 Object obj=new Integer(123); // 父类对象 obj 引用子类 Integer 实例 System.out.println(obj.toString()); // 运行时多 态性,执行子类 Integer 的 toString() 方法 obj=new String("123"); System.out.println(obj.toString()); public static void print(Object[] value) public static int indexOf(Object[] value, Object key)
  • 33. 《数据结构( Java 版)(第 3 版)》 【例 1.4 】排序数组的顺序查 找算法。 ① 对基本数据类型的排序数组进行顺序查找 Java 定义 < 、 <= 、 > 、 >= 关系运算符比较两 个基本数据类型数据值的大小。 ② 对引用数据类型的排序数组进行顺序查找 对 象 用 Comparable 接 口 中 的 compareTo() 方 法比较大小。 public interface Comparable<T>// 可比较接口 { int compareTo(T obj)// 约定比较对象大小的规 则 }
  • 34. 《数据结构( Java 版)(第 3 版)》 public final class Integer extends Number implements Comparable<Integer> { public int compareTo(Integer iobj) // 比较两个对象值大小,返回 -1 、 0 或 1 { return (this.value < iobj.value? -1 : (this.value== iobj.value ? 0:1)); } }
  • 35. 《数据结构( Java 版)(第 3 版)》 public final class String extends Object implements Serializable, Comparable<String>, CharSequence { public int compareTo(String s) // 比较字符串的大小,实现 Comparable 接口 public int compareToIgnoreCase(String s) // 比较字符串的大小,忽略字母大小写 }
  • 36. 《数据结构( Java 版)(第 3 版)》 例 1.5 判断给定字符串是否为 Java 关键字。
  • 37. 《数据结构( Java 版)(第 3 版)》 例 1.6 排序算法及其必要 性。 1. 排序算法的必要 性 2. 直接插入排序 3. 直接选择排序
  • 38. 《数据结构( Java 版)(第 3 版)》 1.3.1 JDK 1.3.2 MyEclipse 要求:掌握编辑、编译、运行 Java Application 程序的基本技能。 重点:编辑、编译、运行 Java 程序。 难点:包, MyEclipse 的项目、工作区, 程序调试技术。 1.3 Java 开发运行环 境
  • 39. 《数据结构( Java 版)(第 3 版)》 1.3.1 JDK 1. 安装 JDK 2. 设置环境变量 a. 在 Windows XP 中设置环境变量 b. 设置环境变量的批命令 3. 编译和运行 Java 程序 a. 执行批命令设置环境变量 b. 编译 c. 运行 Application 应用程序 d. 命令行参数
  • 40. 《数据结构( Java 版)(第 3 版)》 4. 包 ( 1 ) 包的概念 ( 2 ) Java API 的常用包 ( 3 ) 引用包中的类 ( 4 ) 查看 Java API ( 5 ) 查看 Java API 源程序及包等级 ( 6 ) 导入包 ( 7 ) 声明类所在的包 【例 1.7 】 创建及使用 dataStructure 包。 ( 8 ) 默认包路径 ( 9 ) Java 源程序结构 ( 10 ) 包可以压缩成 jar 文件
  • 41. 《数据结构( Java 版)(第 3 版)》 1.3.2 MyEclipse 1. MyEclipse 集成开发环境 ( 1 ) 安装 MyEclipse 并启动 ( 2 ) 界面 ( 3 ) 代码提示和源代码查看 ( 4 ) 项目和工作区
  • 42. 《数据结构( Java 版)(第 3 版)》 2. 创建 Java 项目并运行 ( 1 ) 新建 Java 项目 ( 2 ) 新建 Java 类 ( 3 ) 编辑、编译和运行 ( 4 ) 重构 ( 5 ) 切换工作区 ( 6 ) 访问其他项目中的类和添加 JAR 包 ( 7 ) 选择运行的类和设置命令行参
  • 43. 《数据结构( Java 版)(第 3 版)》 3. 程序调试技术 1. 程序错误、发现时刻及错误处理原 则 语法错、语义错、逻辑错 1. 程序运行方式 a. 正常运行 b. 单步运行 c. 分段运行 3. 调试过程 a. 设置断点 b. 调试界面 c. 单步或分段运行 d. 查看变量的当前值