Java数据结构和算法解析(一)
- 数据结构和算法概述
- 数据结构
- 常见的数据结构
- 数据结构相关术语
- 数据:
- 数据元素
- 数据项
- 数据对象
- 逻辑结构与物理结构
- 逻辑结构
- 物理(存储)结构
- 顺序存储结构:
- 链式存储结构:
- 抽象数据类型(ADT)
- 数据类型
- 抽象数据类型
- 算法
- 算法的基本特性
- 输入输出
- 有穷性
- 确定性
- 可行性
- 算法的设计原则
- 正确性
- 可读性
- 健壮性
- 高效性
- 算法的复杂度
- 时间复杂度
- 空间复杂度
数据结构和算法概述
数据结构
计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合
常见的数据结构
- 数组 Array
- 栈 Stack
- 队列 Queue
- 链表 Linked List
- 树 Tree
- 哈希表 Hash
- 堆 Heap
- 图 Graph
数据结构相关术语
数据:
是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
它不仅包括整型等数值类型,还包括字符、声音、图像等非数值类型。这些类型都具备两个特征:可以输入计算机、能被计算机程序处理
数据元素
是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
数据项
一个数据元素可以由若干个数据项组成。数据项是A数据的不可分割的最小单位。
数据对象
是性质相同的数据元素的集合,是数据的子集
逻辑结构与物理结构
逻辑结构
是指数据对象中数据元素之间的相互关系。分为四种:集合结构、线性结构、树形结构和图形结构。
物理(存储)结构
是指数据的逻辑结构在计算机中的存储形式。数据的存储结构应正确反映数据元素之间的逻辑关系,这是关键。
顺序存储结构:
把数据元素放在地址连续的存储单元中,数据间的逻辑关系和物理关系一致。如,数组。
链式存储结构:
把数据元素放在任意的存储单元中,数据间使用指针关联。数据元素的存储关系不能反映其逻辑关系。如,链表。
抽象数据类型(ADT)
数据类型
指一组性质相同的值的集合及定义在该集合上的一些操作的总称
抽象数据类型
指一个数学模型及定义在该模型上的一组操作。
- 面向对象编程的特征之一就是使用数据类型的实现封装数据,以简化实现、隔离用例开发、实现模块化编程。抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性。它将实际生活中的问题分解为多个规模小、能够独立开发和调试的小型模块,然后进行独立编程。这种方式将代码的影响限制在局部区域,改进了我们的软件质量,促进了代码复用。抽象数据类型抽象的层次越高,那么可复用性也越强。比如:java中的Object是对所有对象的抽象。
java数据类型分为两类:
算法
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的基本特性
输入输出
算法具有零个或多个输入,至少有一个或多个输出。
有穷性
算法在执行有限步后能够自动结束,不会出现无限循环。
确定性
算法的每一步都具有确定的含义,不会出现二义性。
可行性
算法的每一步都能够通过执行有限次操作完成。
算法的设计原则
正确性
算法至少应该具有输入、输出和加工处理无歧义、能正确反映问题的需求、能够得到问题的正确答案。
可读性
便于阅读、理解和交流。
健壮性
输入不合法时,算法能够给出相应的处理,而不是产生错误的结果。
高效性
算法应该尽量满足高效率和低存储的需求。
程序与算法的区别:
程序(program)是软件开发人员根据用户需求开发的、用程序设计语言描述的适合计算机执行的指令(语句)序列。它包括「数据结构」、「算法」、「程序设计方法」和「编程语言」。程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的有穷性,比如操作系统也是一种程序,它可以一直运行。
算法的复杂度
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。
时间复杂度
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
算法的时间复杂度是由最深层嵌套语句的频度决定的。
度量一个算法的时间复杂度通常有两种方式:
- 事后统计法
- 事前分析法(大O表示法)
大O表示法的推导:
- 用常数1取代运行时间中的所有加法常数
- 在修改后的运行次数函数中,只保留最高阶
- 将最高阶系数变为1
算法的时间复杂度是由最深层嵌套语句的频度决定的。
常见时间复杂度大小关系:
算法的时间复杂度和两个因素有关:
- 算法中的最大嵌套循环层数。
- 最大嵌套循环结构中每次循环的次数。
一般来说,具有多项式时间复杂度的算法是可以接受的;具有指数时间复杂度的算法,只有当
足够小时才可以使用。一般效率较好的算法要控制在
或者
空间复杂度
通过计算算法所需要的空间存储,算法空间复杂度的计算公式记作:
,其中,
为问题的模型,
为语句关于
所占存储空间的函数。