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

本文深入解析Java中的数据结构与算法,涵盖数组、栈、队列、链表、树、哈希表、堆、图等核心概念,以及算法的基本特性、设计原则和复杂度分析,是学习Java数据结构和算法的全面指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构和算法概述

数据结构

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

常见的数据结构

  • 数组 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

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

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

O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
算法的时间复杂度和两个因素有关:

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

一般来说,具有多项式时间复杂度的算法是可以接受的;具有指数时间复杂度的算法,只有当 n n n足够小时才可以使用。一般效率较好的算法要控制在 O ( n ) O(n) O(n)或者 O ( l o g n ) O(logn) O(logn)

空间复杂度

通过计算算法所需要的空间存储,算法空间复杂度的计算公式记作: s ( n ) = O ( f ( n ) ) s(n)=O(f(n)) s(n)=O(f(n)),其中, n n n为问题的模型, f ( n ) f(n) f(n)为语句关于 n n n所占存储空间的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值