阅读《数据结构—Java语言描述》一书:打卡第一天
第一章:绪论
1. 概述:
1.1 推开数据结构的大门
- 算法+数据结构 = 程序
- 程序:是计算机指令的组合,用来控制计算机的工作流程,以及完成一定的逻辑功能任务。
- 算法:是程序的逻辑抽象,是解决某类客观问题的策略。
- 数据结构:是数据及其之间关系的反映,从逻辑结构和存储(物理)结构两个层面进行刻画。
1.2 利用计算机实现问题求解:
一个从问题到程序的实现过程
- 目的:为了能够快速解决实际的应用问题!
- 主要步骤:
- 确定问题求解的数学模型(或逻辑结构) :
深入分析问题,确定处理对象,根据逻辑关系给出数学模型。
- 确定存储结构:
根据对象的逻辑结构及其所需功能,选择合适的组织形式并将对象映射到存储器中。
- 设计算法:
讨论设计算法的具体步骤。
- 编程并测试结果:上机测试。
- 确定问题求解的数学模型(或逻辑结构) :
- 总结: 程序设计的本质,在于解决两个主要问题。
- 一是根据实际问题选择一种好的数据结构。
- 二是设计一个好的算法。
- 后者的好坏在很大程度上取决于前者。
1.3 认识了一个大佬:数据结构
- 数据结构与数学、计算机硬件和软件有着十分密切的关系
- 它是介于数学、计算机硬件和软件之间的一门计算机类电子信息类相关专业的核心课程之一
- 是高级程序设计语言、编程原理、操作系统、数据库、人工智能等课程的基础。
- 也广泛应用于信息科学、系统工程、应用数学以及各种工程技术领域。
- 数据结构解决具体问题:
-
数据的逻辑结构(数学模型)
-
数据的存储结构
-
数据操作与运算
-
================================================
2. 基本概念与术语学习
2.1 数据与数据结构
-
术语
-
数据(Data):数据是信息的载体,是对客观事物的符号表示。能够被计算机程序识别、存储、加工和处理。数据还包括图像、声音等非数值数据。
-
数据元素(Data Element):是数据的基本单位,是一个个体。相当于表的一行。数据元素又可称为结点、顶点和记录。在树和图中,一个数据元素用一个圆圈表示。
-
数据项(Data Item):是数据元素的组成部分。相当于表的列。数据项又可分为两种:一种是简单数据项;另一种是组合数据项,例如:出生年月,可进一步划分为"年","月"和"日"等更小的数据项。
-
数据对象(Data Object):性质相同的数据元素的集合。相当于表。数据对象中的数据元素不会是孤立的,而是彼此相关的,这种彼此之间的关系称之为“结构”。
-
数据结构(Data Structure):相互之间存在一种或多种特定关系的数据元素的集合。
-
--------------------------------------------------------------------------------
-
逻辑结构
-
逻辑结构:数据元素之间的逻辑关系,与数据存储无关,独立与计算机之外。
-
数据元素之间存在开始结点,终端结点,以及前驱和后继。除了开始和终端结点,其他结点由有一个前驱和一个后继。开始结点有一个后继,终端结点有一个前驱。
-
-
- 数据元素之间按照逻辑关系的特性来分,可将数据结构归纳为4类:
-
集合:元素之间没有关系,比较松散。
-
线性结构:元素之间存在==一对一==关系。
-
树形结构:元素之间存在==一对多==关系。
-
图形结构:元素之间存在==多对多==关系。
-
—— 有时也将逻辑结构分为两大类,一类是线性结构,另一类是非线性结构。其中树、图和集合都属于非线性结构。
—— 数据的逻辑结构需要2部分:数据元素(data)、数据元素之间的关系(relationship)
- 从形式上可采用一个二元组来定义,定义形式为:
Data_Structures = (D, R )
-------------------------------------------------------------------------------
-
存储结构
-
存储结构:数据的存储结构,也称为物理结构,是数据的逻辑结构在计算机的实现。
-
它包括数据元素在计算机中的值存储表示和逻辑关系的存储表示
-
在计算机在最小的数据表示单位是二进制数的一位(bit)。
-
-
-
存储结构的4种方式:
-
顺序存储:在一片连续的存储空间中进行存储,数据元素的逻辑位置和物理位置关系保持一致。例如:数组
-
2. 链式存储:数据元素可以存储在任意的物理位置上,需要额外的部分存放在逻辑关系的指针来表示。例如:链表
3. 索引存储:存储数据的同时,额外的存储一个索引表。在查询时可以提高效率。
4. 散列存储:一般情况物理上可以将数据元素存储在一片连续的区域内,需要通过散列函数hash(哈希)
来确定存储位置。在查询时可以提高效率。
------------------------------------------------------------------------------------
-
数据的操作
-
初始化:创建、销毁:
-
数据操作:插入/添加、删除、修改
-
数据使用:查找、遍历
-
—— 数据的逻辑结构、存储结构和运算是数据结讨论中不可分割的3个方面。他们中任何一个不同都将导致不同的数据结构。例如:
===========================================
2.2 数据类型
—— 基本数据类型:值不可分解,只能作为一个整体来进行处理
- 整型【byte、short、int、long】
- 浮点型【float、double】
- 布尔型【boolean】
- 字符型【char】
2.3 抽象数据类型
- 抽象:指抽取反映问题本质的东西,忽略其非本质的细节。在求解过程中只关注人们“做什么”,而不是“怎么做”。
- 数据抽象:将数据使用与实现分离开来。一般通过抽象数据类型来实现。
- 数据抽象类型:指一数据值的集合和定义在这个集合是的一组操作。是指隐藏了数据的存储结构并且不涉及操作的实现细节的数据类型。
- 抽象类型的描述有2种:
- 使用抽象类【abstract】表示,抽象类型的实现用继承该抽象类的子类表示:
- 用Java接口【interface】表示,抽象类型的实现用实现接口的类表示。
===================================================
3. 算法和算法分析
3.1 算法的基本概念
-
算法:对特定问题求解步骤的一种描述。是指令的有限序列。
3.2 算法特性
-
有穷性:有限
-
确定性:需求确定、指令确定
-
有效性:指令都是由意义
-
输入:待处理的信息
-
输出:经处理后的信息
3.3 算法目标
-
正确性:应满足具体问题的功能和性能要求,需求和实现对应。
-
可读性:使程序员能够读懂,编写代码时可以辅助注释。
-
健壮性:临界值的处理、无效数据的校验等。具有良好的容错性,具有正确的判断能力和及时纠错能力。
-
高效性:使用较少的资源(资源分2种:时间资源、空间资源)。一个好的算法要做到执行时所需时间尽量短,所需的最大存储空间尽量少。
3.4 算法的描述
- 可采用某种语言,也可借助数据流程图来表示。
- 描述算法的语言主要有三种形式:
- 自然语言:用中文或英文文字来描述,其优点是简单、易懂,但严谨不够。
- 程序设计语言: 采用某种具体的程序设计语言来描述算法。其优点是算法不用修改可直接执行。但使用程序来描述算法并不容易,也不直观,往往需加入大量注释。
- 伪代码:是一种类似于程序设计语言的语言。【由于这种描述不是真正的程序设计语言。因而称为伪代码】。它介于自然语言和程序设计语言之间。
3.4 算法分析:概述
-
算法的复杂度是衡量算法优劣的重要依据。
-
计算机资源主要分为时间资源和空间资源。
-
算法的复杂度分类:时间复杂度、空间复杂度。
-
时间复杂度:执行时间的长短。
-
空间复杂度:执行时空间需求量,也就是计算机资源的使用量。
-
3.5 算法分析:时间复杂度
-
主要考虑因素:
-
算法本身
-
问题规模即处理问题时所处理的数据元素的个数
-
程序设计所采用的程序语言选择
-
编译程序(JDK优劣)所产生的机器代码的质量
-
计算机执行指令的硬件速度
-
程序运行的软件环境
-
-
时间复杂度通过
大O表示法
进行表示的,大O表达式只需要考虑最高次幂的项。-
常量阶:O(1)
-
线性阶:O(n)
-
平方阶:O(n^2)
-
立方阶:O(n^3)
-
对数阶:O(log2n)
-
线性对数阶:O(nlog2n)
-
- O(log2n) 指数计算:R表示次数
-
O (n) :一层循环
-
O(n^2):二层循环(99乘法表)
int n = 9;for(int i = 0 ; i < n ; i ++) { for(int j = 0 ; j < n : j ++) { // 次数 n*n }}
- O(n^3):三层循环
int n = 9;for(int i = 0 ; i < n ; i ++) { //时针 for(int j = 0 ; j < n : j ++) { //分针 for(int m = 0 ; m < n ; m++) { //秒针 // 次数 n * n * n } }}
-
西格玛Σ 求和
- 需求:1+2+3+4+....+n
4. 每日一练:
1. ( )是性质相同的数据元素的集合,是数据的子集。
A、数据元素
B.数据对象
C.数据结构
D.数据项
--------------------------------------------------------------------------------------------
2. 把数据存储到计算机中,并具体体现数据元素间的逻辑结构称为( )。
A.物理结构 (存储结构)
B.逻辑结构
C.算法的具体实现
D.给相关变量分配存储单元
--------------------------------------------------------------------------------------------
3. 从 n 个数中选取最大元素( )。
A.基本操作是数据元素间的交换 (比较)
B.算法的时间复杂度是 O(n2)
C.算法的时间复杂度是 O(n)
D.需要进行(n+1)次数据元素间的比较 (次数 (n-1))
--------------------------------------------------------------------------------------------
4. 数据的( )结构与所使用的计算机无关。
A.逻辑
B.物理
C.存储
D.逻辑与存储
--------------------------------------------------------------------------------------------
5. 数据的物理结构( )。
A.与数据的逻辑结构无关
B.仅仅包括数据元素的表示
C.只包括数据元素间关系的表示
D.包括数据元素的表示和关系的表示
--------------------------------------------------------------------------------------------
6. 数据结构中,与所使用的计算机无关的是数据的( )结构。
A.物理
B.存储
C.逻辑与物理
D.逻辑
--------------------------------------------------------------------------------------------
7. 数据元素是数据的基本单位,它( )。
A.只能有一个数据项组成
B.至少有二个数据项组成
C.可以是一个数据项也可以由若干个数据项组成
D.至少有一个数据项为指针类型
--------------------------------------------------------------------------------------------
8. 算法的时间复杂度与( )有关。
A.所使用的计算机
B.计算机的操作系统
C.算法本身
D.数据结构
--------------------------------------------------------------------------------------------
9. 同一种逻辑结构( )。
A.只能有唯一的存储结构
B.可以有不同的存储结构 (线性结构:可以使用顺序存储ArrayList、也可以链式存储结构LinkedList)
C.只能表示某一种数据元素之间的关系
D.以上三种说法均不正确
--------------------------------------------------------------------------------------------
10. 线性结构中数据元素的位置之间存在( )的关系。
A.一对一
B.一对多
C.多对多
D.每一个元素都有一个直接前驱和一个直接后继
--------------------------------------------------------------------------------------------
11. 树形结构中数据元素的位置之间存在( )的关系。
A.一对一
B.一对多
C.多对多
D.每一个元素都有一个直接前驱和一个直接后继
--------------------------------------------------------------------------------------------
12. 图形结构中数据元素的位置之间存在( )的关系。
A.一对一
B.一对多
C.多对多
D.每一个元素都有一个直接前驱和一个直接后继
--------------------------------------------------------------------------------------------
13. 以下特征中,( )不是算法的特性。
A.有穷性
B.确定性
C.有效性
D.有 0 个或多个输出
--------------------------------------------------------------------------------------------
14. 某算法的时间复杂度为 O(n),表明该算法的( )
A.问题规模为 n
B.执行时间等于 n
C.执行的时间与 n 成正比
D.问题规模与 n 成正比
--------------------------------------------------------------------------------------------
15. 以下算法的时间复杂度为( )。
void fun(int n){ int j=0; for (i=1;i<=n;i++) // i=i*2 j=j+i;}
A. O(n)
B. O(n2)
C. O(nlog2n)
D. O(log2n)
--------------------------------------------------------------------------------------------
16. 以下算法的时间复杂度为( )。
void fun(int n){ int sum=0; for ( int i=1;i<=n;i++) for ( int j=1;j<=n;j++) sum+=j*i;}
A. O(n)
B. O(n2)
C. O(nlog2n)
D. O(log2n)