当前位置:网站首页 > Java基础 > 正文

java算法基础和数据结构



一、初识数据结构与算法

1.1 数据结构与算法

数据结构是指在计算机中组织和存储数据的方式。它关注数据的逻辑关系、操作和存储方式,以及如何有效地访问和修改数据。常见的数据结构包括数组、链表、栈、队列、树、图等。

算法是解决问题的一系列步骤或规则。它描述了如何通过输入数据来产生所需的输出结果。算法可以用来执行各种计算任务,如排序、搜索、图形处理等。好的算法应该具有正确性、可读性、高效性和健壮性。

数据结构和算法之间存在密切的关系。选择合适的数据结构可以提高算法的效率,而好的算法可以更好地利用数据结构的优势。数据结构和算法相互支持,共同构成了计算机科学的基础。

1.2 二分查找

二分查找(Binary Search)(折半查找)是一种在有序数组中查找特定元素的常用算法。它通过将目标值与数组中间元素进行比较,从而将查找范围缩小一半,直到找到目标值或确定目标值不存在。

1.0版 基础版

 

2.0版 改动版

 

1.3 如何判断算法好坏

1.3.1 时间复杂度

时间复杂度是衡量算法执行时间随输入规模增长而变化的度量。它表示了算法执行所需的基本操作数量,通常用大 O 符号来表示。

以下是常见的时间复杂度:

  • 常数时间复杂度:O(1),表示算法的执行时间不随输入规模变化而变化,执行时间固定。
  • 对数时间复杂度:O(log n),表示算法的执行时间随输入规模呈对数级增长。例如,二分查找算法就具有对数时间复杂度。
  • 线性时间复杂度:O(n),表示算法的执行时间随输入规模呈线性增长。例如,遍历一个数组的算法就具有线性时间复杂度。
  • 线性对数时间复杂度:O(n log n),表示算法的执行时间随输入规模呈线性对数级增长。例如,快速排序和归并排序等排序算法具有线性对数时间复杂度。
  • 平方时间复杂度:O(n^2),表示算法的执行时间随输入规模呈平方级增长。例如,嵌套循环的算法就具有平方时间复杂度。
  • 指数时间复杂度:O(2^n),表示算法的执行时间随输入规模呈指数级增长。指数时间复杂度的算法通常具有非常高的时间复杂度,效率很低。

需要注意的是,时间复杂度只是对算法执行时间的一种度量方式,它可以帮助我们比较不同算法的效率。在实际应用中,除了时间复杂度,还需要考虑空间复杂度、具体硬件环境等因素来综合评估算法的性能。

1.3.2 空间复杂度

空间复杂度是衡量算法在执行过程中所需的额外空间(内存)随输入规模增长而变化的度量。它表示了算法所需的额外空间与输入规模之间的关系,通常用大 O 符号来表示。

以下是常见的空间复杂度:

  • 常数空间复杂度:O(1),表示算法的额外空间使用量固定,不随输入规模变化而变化。常数空间复杂度的算法只使用固定数量的额外内存空间。
  • 线性空间复杂度:O(n),表示算法的额外空间使用量随输入规模线性增长。例如,在存储输入数据的数组或列表中,算法需要使用与输入规模相等的额外空间。
  • 线性对数空间复杂度:O(n log n),表示算法的额外空间使用量随输入规模呈线性对数级增长。例如,某些排序算法在排序过程中需要使用辅助空间,其空间复杂度与输入规模的对数级相关。
  • 平方空间复杂度:O(n^2),表示算法的额外空间使用量随输入规模平方级增长。例如,在存储二维矩阵或多维数组时,算法需要使用与输入规模平方相关的额外空间。

需要注意的是,空间复杂度只考虑算法在执行过程中所需的额外空间,不包括输入数据本身的空间。在实际应用中,除了空间复杂度,还需要综合考虑时间复杂度、具体硬件环境等因素来评估算法的性能。

1.4 重看二分查找

⼆分查找性能

下⾯分析⼆分查找算法的性能

时间复杂度

最坏情况:O(log n)

最好情况:如果待查找元素恰好在数组中央,只需要循环⼀次 O(1)

空间复杂度

需要常数个指针 i,j,m,因此额外占⽤的空间是 O(1)

3.0 平衡版

 

4.0 java版

 

5.1 返回的是最左侧的重复元素

 

改动:

java算法基础和数据结构

5.1 返回的是最右侧的重复元素

 

改动:

 

二、基础数据结构

2.1 数组

空间占用:

Java 中数组结构为

  • 8 字节 markword
  • 4 字节 class 指针(压缩 class 指针的情况)
  • 4 字节 数组大小(决定了数组最大容量是 2^{32})

版权声明


相关文章:

  • java主类基础笔记2024-10-27 09:02:02
  • aop是java基础吗2024-10-27 09:02:02
  • java基础类型string2024-10-27 09:02:02
  • java基础教程第7讲2024-10-27 09:02:02
  • java零基础要多久学会英语2024-10-27 09:02:02
  • java语法基础运算符2024-10-27 09:02:02
  • java基础入门课视频2024-10-27 09:02:02
  • java大小写转化基础2024-10-27 09:02:02
  • 善知教育java基础2024-10-27 09:02:02
  • java程序设计基础约瑟夫环2024-10-27 09:02:02