Java数据结构和算法解析(一)

  • 数据结构和算法概述
  • 数据结构
  • 常见的数据结构
  • 数据结构相关术语
  • 数据:
  • 数据元素
  • 数据项
  • 数据对象
  • 逻辑结构与物理结构
  • 逻辑结构
  • 物理(存储)结构
  • 顺序存储结构:
  • 链式存储结构:
  • 抽象数据类型(ADT)
  • 数据类型
  • 抽象数据类型
  • 算法
  • 算法的基本特性
  • 输入输出
  • 有穷性
  • 确定性
  • 可行性
  • 算法的设计原则
  • 正确性
  • 可读性
  • 健壮性
  • 高效性
  • 算法的复杂度
  • 时间复杂度
  • 空间复杂度


数据结构和算法概述

数据结构

计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合

常见的数据结构

  • 数组 Array
  • 栈 Stack
  • 队列 Queue
  • 链表 Linked List
  • 树 Tree
  • 哈希表 Hash
  • 堆 Heap
  • 图 Graph

数据结构相关术语

数据:

是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
它不仅包括整型等数值类型,还包括字符、声音、图像等非数值类型。这些类型都具备两个特征:可以输入计算机、能被计算机程序处理

数据元素

是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。

数据项

一个数据元素可以由若干个数据项组成。数据项是A数据的不可分割的最小单位。

数据对象

是性质相同的数据元素的集合,是数据的子集

逻辑结构与物理结构

逻辑结构

是指数据对象中数据元素之间的相互关系。分为四种:集合结构、线性结构、树形结构和图形结构。

数据结构与算法分析 python 数据结构与算法分析java_Java数据结构和算法(一)

物理(存储)结构

是指数据的逻辑结构在计算机中的存储形式。数据的存储结构应正确反映数据元素之间的逻辑关系,这是关键

顺序存储结构:

把数据元素放在地址连续的存储单元中,数据间的逻辑关系和物理关系一致。如,数组。

链式存储结构:

把数据元素放在任意的存储单元中,数据间使用指针关联。数据元素的存储关系不能反映其逻辑关系。如,链表。

抽象数据类型(ADT)

数据类型

指一组性质相同的值的集合及定义在该集合上的一些操作的总称

抽象数据类型

指一个数学模型及定义在该模型上的一组操作。

  • 面向对象编程的特征之一就是使用数据类型的实现封装数据,以简化实现、隔离用例开发、实现模块化编程。抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性。它将实际生活中的问题分解为多个规模小、能够独立开发和调试的小型模块,然后进行独立编程。这种方式将代码的影响限制在局部区域,改进了我们的软件质量,促进了代码复用。抽象数据类型抽象的层次越高,那么可复用性也越强。比如:java中的Object是对所有对象的抽象。

java数据类型分为两类:

数据结构与算法分析 python 数据结构与算法分析java_数据结构与算法分析 python_02

算法

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

算法的基本特性

输入输出

算法具有零个或多个输入,至少有一个或多个输出。

有穷性

算法在执行有限步后能够自动结束,不会出现无限循环。

确定性

算法的每一步都具有确定的含义,不会出现二义性。

可行性

算法的每一步都能够通过执行有限次操作完成。

算法的设计原则

正确性

算法至少应该具有输入、输出和加工处理无歧义、能正确反映问题的需求、能够得到问题的正确答案。

可读性

便于阅读、理解和交流。

健壮性

输入不合法时,算法能够给出相应的处理,而不是产生错误的结果。

高效性

算法应该尽量满足高效率和低存储的需求。

程序与算法的区别:

程序(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

算法的时间复杂度是由最深层嵌套语句的频度决定的。

常见时间复杂度大小关系:

数据结构与算法分析 python 数据结构与算法分析java_数据_03
算法的时间复杂度和两个因素有关:

  • 算法中的最大嵌套循环层数。
  • 最大嵌套循环结构中每次循环的次数。

一般来说,具有多项式时间复杂度的算法是可以接受的;具有指数时间复杂度的算法,只有当数据结构与算法分析 python 数据结构与算法分析java_时间复杂度_04足够小时才可以使用。一般效率较好的算法要控制在数据结构与算法分析 python 数据结构与算法分析java_数据结构_05或者数据结构与算法分析 python 数据结构与算法分析java_数据结构_06

空间复杂度

通过计算算法所需要的空间存储,算法空间复杂度的计算公式记作:数据结构与算法分析 python 数据结构与算法分析java_数据结构与算法分析 python_07,其中,数据结构与算法分析 python 数据结构与算法分析java_时间复杂度_04为问题的模型,数据结构与算法分析 python 数据结构与算法分析java_Java数据结构和算法(一)_09为语句关于数据结构与算法分析 python 数据结构与算法分析java_时间复杂度_04所占存储空间的函数。