这是 Princeton Algorithms Course 的第二篇笔记
对应的 lecture 是 coursera 上的第二周的内容
包括了 Bags, Stack, Queue, Iterator & Elementary Sort
由于之前我们已经讨论过 Stack 和 Queue,在此不再过多叙述
Iterator
One of the fundamental operations on collections is to process each item by iterating through the collection using Java’s foreach statement
上面的代码等同于如下代码,但显然 foreach statement 更简洁
当我们在 implements 数据结构的时候,也要考虑使其继承 Iterable 接口
当然,也要加上异常处理机制UnsupportedOperationException
if a client calls remove()
NoSuchElementException
if a client class next()
when i is 0
也要注意在代码开头加上 import java.util.Iterator;
因为 Iterator 不在 java.lang 包里面
以下是 Bag 的完整实现
Assignment 2
在 Courser 上第二周里有个编程作业
要求实现 Deques and Randomized Queues
具体的 assignment 要求在这里
下面是我的代码,仅供参考
Deque
Dequeue. A double-ended queue or deque (pronounced “deck”) is a generalization of a stack and a queue that supports adding and removing items from either the front or the back of the data structure.
|
|
Randomized queue
Randomized queue. A randomized queue is similar to a stack or queue, except that the item removed is chosen uniformly at random from items in the data structure.
|
|
值得一提的是,在上面的代码中,我使用了 Princeton 的 Java library 里的方法StdOut.println()
和 StdRandom.uniform()
在 Eclipse 中,需要把下载下来的 algs.jar 包导入到 build path 中
具体操作如下:project -> properties -> java build path -> Add Jar
整个代码的实现思路还是很简单的,值得注意的是 Iterator 里的 next()
方法
当我们随机取出一个数后,做了如下操作:
把最后一个元素填补到该取出的元素索引那里
再把最后一个元素赋值为 null
Permutation client
|
|
Elementary Sort
Elementary Sort 这一节 lecture 里讲了 Selection Sort,Insertion Sort,ShellSort,Shuffling 等不同的 sort algorithms
下面就来一一分析
Selection Sort
Selection Sort 作为最基本的 sort algorithm,它的逻辑也是很简洁明了的
即遍历整个数组,在余下的数组元素中找到最小的,于此时的第一个元素交换
下面给出了它的伪代码
Java 代码实现如下
Time Complexity: O(n^2)
proof: For each i fromm 0 to N - 1, there is one exchange and N - 1 - i copmares, so the totals are N exchanges and (N-1) + (N-2) + (N-3) + … + 0 = N(N-1)/2 ~ N^2/2 compares
Auxiliary Space: O(1)
Insertion Sort
关于 Insertion Sort 的详细讨论在之前的 MIT 6.006 的一篇笔记中已经讨论过了
在此不再多说,具体地址在这里
Shellsort
Shellsort 类似于 Insertion sort,不同点在于 Insertion sort 一个个地交换元素
直到元素在合适地地方为止
而 Shellsort 允许我们间隔 t 个元素来进行这样的比较和交换
称之为 t-sorted, 同时不断减小 t 的值,直到1为止
We make the array h-sorted for a large value of h. We keep reducing the value of h until it becomes 1. An array is said to be h-sorted if all sublists of every h’th element is sorted.
Shellsort 可视化演示
我们一般选取 t = n / 3 + 1
Java 代码实现如下
对于该算法的时间分析比较复杂
根据 t 的取值不同,花费的时间也不同
在学术界关于 Shellsort 的讨论仍然没有明确的结果
在此不过多叙述
Shuffling
- In iterator i, pick integer r between 0 and i uniformly at random.
- Swap a[i] and a[r]
Linear time shuffling algorithms
Convex Hull
The convex hull of a set of N points is the smallest perimeter fence enclosing the points.
Equivalent definations:
- Smallest convex set containging all the points.
- Smallest area convex polygon enclosing the points.
- Convex polygon enclosing the points, whose vertices are points in set.
Convex hull output:
Sequence of vertices in counterclockwise order