From fa135fe1a9f9d1d66882346f36b52961f2cc9853 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Wed, 28 Oct 2026 22:51:11 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E7=AE=97=E6=B3=95=20-=20=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 代码经本地运行验证;StopWatch 改为返回毫秒,与表格一致;删除标题中多余的空格,文字校对。 --- notes/算法 - 算法分析.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/notes/算法 - 算法分析.md b/notes/算法 - 算法分析.md index 2b53c6b1..e59d646c 100644 --- a/notes/算法 - 算法分析.md +++ b/notes/算法 - 算法分析.md @@ -23,43 +23,43 @@ ## 数学模型 -### 1. 近似 +### 1. 近似 N3/6-N2/2+N/3 \~ N3/6。使用 \~f(N) 来表示所有随着 N 的增大除以 f(N) 的结果趋近于 1 的函数。 -### 2. 增长数量级 +### 2. 增长数量级 N3/6-N2/2+N/3 的增长数量级为 O(N3)。增长数量级将算法与它的具体实现隔离开来,一个算法的增长数量级为 O(N3) 与它是否用 Java 实现,是否运行于特定计算机上无关。 -### 3. 内循环 +### 3. 内循环 执行最频繁的指令决定了程序执行的总时间,把这些指令称为程序的内循环。 -### 4. 成本模型 +### 4. 成本模型 使用成本模型来评估算法,例如数组的访问次数就是一种成本模型。 ## 注意事项 -### 1. 大常数 +### 1. 大常数 在求近似时,如果低级项的常数系数很大,那么近似的结果是错误的。 -### 2. 缓存 +### 2. 缓存 计算机系统会使用缓存技术来组织内存,访问数组相邻的元素会比访问不相邻的元素快很多。 -### 3. 对最坏情况下的性能的保证 +### 3. 对最坏情况下的性能的保证 在核反应堆、心脏起搏器或者刹车控制器中的软件,最坏情况下的性能是十分重要的。 -### 4. 随机化算法 +### 4. 随机化算法 通过打乱输入,去除算法对输入的依赖。 -### 5. 均摊分析 +### 5. 均摊分析 -将所有操作的总成本除于操作总数来将成本均摊。例如对一个空栈进行 N 次连续的 push() 调用需要访问数组的次数为 N+4+8+16+...+2N=5N-4(N 是向数组写入元素的次数,其余都是调整数组大小时进行复制需要的访问数组次数),均摊后访问数组的平均次数为常数。 +将所有操作的总成本除以操作总数来将成本均摊。例如对一个空栈进行 N 次连续的 push() 调用需要访问数组的次数为 N+4+8+16+...+2N=5N-4(N 是向数组写入元素的次数,其余都是调整数组大小时进行复制需要的访问数组次数),均摊后访问数组的平均次数为常数。 ## ThreeSum @@ -71,7 +71,7 @@ public interface ThreeSum { } ``` -### 1. ThreeSumSlow +### 1. ThreeSumSlow 该算法的内循环为 `if (nums[i] + nums[j] + nums[k] == 0)` 语句,总共执行的次数为 N(N-1)(N-2)/6 = N3/6-N2/2+N/3,因此它的近似执行次数为 \~N3/6,增长数量级为 O(N3)。 @@ -95,7 +95,7 @@ public class ThreeSumSlow implements ThreeSum { } ``` -### 2. ThreeSumBinarySearch +### 2. ThreeSumBinarySearch 将数组进行排序,对两个元素求和,并用二分查找方法查找是否存在该和的相反数,如果存在,就说明存在和为 0 的三元组。 @@ -146,7 +146,7 @@ public class BinarySearch { } ``` -### 3. ThreeSumTwoPointer +### 3. ThreeSumTwoPointer 更有效的方法是先将数组排序,然后使用双指针进行查找,时间复杂度为 O(N2)。 @@ -233,7 +233,7 @@ public class StopWatch { public static double elapsedTime() { long now = System.currentTimeMillis(); - return (now - start) / 1000.0; + return now - start; } } ```