1. 算法分析

研究算法的最终目的就是如何花更少的时间,如何占用更少的内存去完成相同的需求,并且
也通过案例演示了不同算法之间时间耗费和空间耗费上的差异,但我们并不能将时间占用和空间占用量化,因此,接下来我们要学习有关算法时间耗费和算法空间耗费的描述和分析。有关算法时间耗费分析,我们称之为算法的时间复杂度分析,有关算法的空间耗费分析,我们称之为算法的空间复杂度分析。

1.1. 时间复杂度分析-大O记法

1.1.1. 定义

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况并确定T(n)的量级。算法的时间复杂度,就是算法的时间量度,记作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度,其中f(n)是问题规模n的某个函数。
在这里,我们需要明确一个事情:执行次数=执行时间用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。

1.1.2. 常见的大O阶

常数阶:O(1)
对数阶:O(logn)
线性阶:O(n)
线性对数阶: O(nlogn)
平方阶:O(n2)
立方阶:O(n3)
k次方阶:O(nk)
指数阶:O(2n)

他们的复杂程度从低到高依次为:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(nk)<O(2n)

1.2. 空间复杂度分析

1.基本数据类型内存占用情况:

2.计算机访问内存的方式都是一次一个字节

3.一个引用(机器地址)需要8个字节表示:
例如: Date date = new Date(),则date这个变量需要占用8个字节来表示
4.创建一个对象,比如new Date(),除了Date对象内部存储的数据(例如年月日等信息)占用的内存,该对象本身也有内存开销,每个对象的自身开销是16个字节,用来保存对象的头信息
5.一般内存的使用,如果不够8个字节,都会被自动填充为8字节的倍数字节数:

6.java中数组被被限定为对象,他们一般都会因为记录长度而需要额外的内存,一个原始数据类型的数组一般需要:24字节的头信息(16个自己的对象开销,4字节用于保存长度以及4个填充字节),再加上保存值所需的内存。

了解了java的内存最基本的机制,就能够有效帮助我们估计大量程序的内存使用情况。

算法的空间复杂度计算公式记作:S(n)=O(f(n)),其中n为输入规模,f(n)为语句关于n所占存储空间的函数。

2. 算法题

[[Java基础-算法题解析]]

3. 算法汇总

image-20211016144158004

4. 排序算法

4.1. 算法分类

image-20200202124614464

内部排序和外部排序。
内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序操作都在内存中完成。
外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。

4.2. 算法比较

image-20200202124639588

5. 查找算法

5.1. BM

https://blog.csdn.net/DBC_121/article/details/105569440
https://www.zhihu.com/question/21923021

6. 其他算法

https://www.cnblogs.com/hongdada/p/10406902.html
https://leetcode.cn/problems/lru-cache/
[[20221011-LRU和LFU的区别 - stardsd - 博客园]]

6.1. LRU

6.2. LFU

6.3. FIFO

7. 参考

7.1. 左程云算法

/Users/taylor/Nutstore Files/Obsidian_data/pages/002-schdule/001-Arch/001-Subject/001-基础知识专题/000-数据结构与算法/左神算法资料

7.2. 吴师兄学算法

https://blog.algomooc.com/
动图:https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg
https://github.com/GarenXie1/LeetCodeAnimation

7.3. CodeSheep

https://mp.weixin.qq.com/s/ekGdneZrMa23ALxt5mvKpQ

7.4. 抖码课堂

https://www.bilibili.com/video/BV1qL411M7iB/?p=103&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204
代码已下载
/Users/weileluo/obsidian_repo/Obsidian_data/pages/002-schdule/001-Arch/001-Subject/013-DemoCode/algo_interview_bilibili-master

7.5. 黑马程序员

https://www.bilibili.com/video/BV1iJ411E7xW?p=56&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204
代码已下载

7.6. 图灵学院

/Users/taylor/Nutstore Files/Obsidian_data/pages/002-schdule/001-Arch/001-Subject/001-基础知识专题/000-数据结构与算法/算法资料/leetcode算法资料.pdf

https://www.jianshu.com/p/33cffa1ce613