From 55d6a9aaa5460d8ef663b8d801a4707d6e8a563c Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Thu, 29 Mar 2018 16:50:57 +0800
Subject: [PATCH] auto commit
---
notes/算法.md | 47 ++++++++++++++---------------------------------
1 file changed, 14 insertions(+), 33 deletions(-)
diff --git a/notes/算法.md b/notes/算法.md
index 3a8a4843..fcbad506 100644
--- a/notes/算法.md
+++ b/notes/算法.md
@@ -1,6 +1,5 @@
* [一、算法分析](#一算法分析)
- * [函数转换](#函数转换)
* [数学模型](#数学模型)
* [ThreeSum](#threesum)
* [倍率实验](#倍率实验)
@@ -34,31 +33,15 @@
# 一、算法分析
-## 函数转换
-
-指数函数可以转换为线性函数,从而在函数图像上显示的更直观。例如
-
-
-
-可以在其两端同时取对数,得到:
-
-
-
-
-
## 数学模型
### 1. 近似
-使用 \~f(N) 来表示所有随着 N 的增大除以 f(N) 的结果趋近于 1 的函数,例如 N3/6-N2/2+N/3 \~ N3/6。
-
-
+N3/6-N2/2+N/3 \~ N3/6。使用 \~f(N) 来表示所有随着 N 的增大除以 f(N) 的结果趋近于 1 的函数。
### 2. 增长数量级
-增长数量级将算法与它的实现隔离开来,一个算法的增长数量级为 N3 与它是否用 Java 实现,是否运行于特定计算机上无关。
-
-
+N3/6-N2/2+N/3 的增长数量级为 O(N3)。增长数量级将算法与它的实现隔离开来,一个算法的增长数量级为 O(N3)与它是否用 Java 实现,是否运行于特定计算机上无关。
### 3. 内循环
@@ -91,7 +74,7 @@ public class ThreeSum {
}
```
-该算法的内循环为`if (a[i] + a[j] + a[k] == 0)`语句,总共执行的次数为 N(N-1)(N-2) = N3/6 - N2/2 + N/3,因此它的近似执行次数为 \~N3/6,增长数量级为 N3。
+该算法的内循环为 if (a[i] + a[j] + a[k] == 0) 语句,总共执行的次数为 N(N-1)(N-2) = N3/6 - N2/2 + N/3,因此它的近似执行次数为 \~N3/6,增长数量级为 N3。
**改进**
@@ -125,7 +108,14 @@ public class ThreeSumFast {
例如对于暴力方法的 ThreeSum 算法,近似时间为 \~N3/6。进行如下实验:多次运行该算法,每次取的 N 值为前一次的两倍,统计每次执行的时间,并统计本次运行时间与前一次运行时间的比值,得到如下结果:
-
+| N | Time | Ratio |
+| --- | --- | --- |
+| 250 | 0.0 | 2.7 |
+| 500 | 0.0 | 4.8 |
+| 1000 | 0.1 | 6.9 |
+| 2000 | 0.8 | 7.7 |
+| 4000 | 6.4 | 8.0 |
+| 8000 | 51.1 | 8.0 |
可以看到,T(2N)/T(N) \~ 23,因此可以确定 T(N) \~ aN3logN。
@@ -155,9 +145,7 @@ public class ThreeSumFast {
## 栈
-first-in-last-out(FILO)
-
-
+> First-In-Last-Out
**1. 数组实现**
@@ -220,12 +208,6 @@ public class ResizeArrayStack- implements Iterable
- {
}
```
-上面实现使用了泛型,Java 不能直接创建泛型数组,只能使用转型来创建。
-
-```java
-Item[] arr = (Item[]) new Object[N];
-```
-
**2. 链表实现**
需要使用链表的头插法来实现,因为头插法中最后压入栈的元素在链表的开头,它的 next 指针指向前一个压入栈的元素,在弹出元素使就可以通过 next 指针遍历到前一个压入栈的元素从而让这个元素称为新的栈顶元素。
@@ -265,11 +247,10 @@ public class Stack
- {
}
}
```
+
## 队列
-first-in-first-out(FIFO)
-
-
+> First-In-First-Out
下面是队列的链表实现,需要维护 first 和 last 节点指针,分别指向队首和队尾。