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 节点指针,分别指向队首和队尾。