普林斯顿大学算法课 Algorithms 学习资源

普林斯顿大学算法课 Algorithms 学习资源的相关文章

普林斯顿大学算法课 Algorithm Part I Week 3 排序稳定性 Stability

稳定性(Stability):先按性质A排序,再按性质B排序,性质B相同的那些项是否仍然是按性质A排序的? 一个稳定的排序,相同值的元素应仍保持相对顺序(relative order) 稳定的算法:插入排序.Mergesort等 不稳定的算法:选择排序:Shellsort等

普林斯顿大学算法课 Algorithm Part I Week 3 排序算法复杂度 Sorting Complexity

计算复杂度(Computational complexity):用于研究解决特定问题X的算法效率的框架 计算模型(Model of computation):可允许的操作(Allowable operations) 成本模型(Cost model):操作数(Operation counts) 上界(Upper bound):最多的成本 下界(Lower bound):最少的成本 最优算法(Optimal algorithm):最有可能性的成本的算法(Algorithm with best pos

普林斯顿大学算法课 Algorithm Part I Week 3 快速排序 Quicksort

发明者:Sir Charles Antony Richard Hoare 基本思想: 先对数据进行洗牌(Shuffle the array) 以数据a[j]为中心进行分区(Partition),使得a[j]左侧的数据都小于等于a[j],a[j]右侧的数据都大于等于a[j] 分区完后递归排序 演示(Quicksort partitioning demo) 重复操作指导i和j指针相遇 当a[i] < a[lo]时,令i从左往右扫描 当a[j] > a[lo]时,令j从右往左扫描 交换a[i]和a[

普林斯顿大学算法课 Algorithm Part I Mergesort 归并排序

起源:冯·诺依曼最早在EDVAC上实现 基本思想: 将数组一分为(Divide array into two halves) 对每部分进行递归式地排序(Recursively sort each half) 合并两个部分(Merge two halves) 归并排序体现的是一种分治思想(Divide and conquer) 演示: 1. 给出原数组a[],该数组的lo到mid,mid+1到hi的子数组是各自有序的. 2. 将数组复制到辅助数组(auxiliary array)中,给两部分的首元

普林斯顿大学算法课 Algorithm Part I Week 3 重复元素排序 - 三路快排 Duplicate Keys

很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路快排就没有这样的问题. 归并排序对重复数据排序的比较在1/2NlgN和NlgN之间 三路快排 目标:将数据分成三个区间(3-way partitioning) lt和gt区间内的元素都和比较元素v相等 lt左边的元素都比v小 gt右边的元素都比v大 性能 三路快排的复杂度比普通快排小,主要取决于数据

普林斯顿大学算法课 Algorithm Part I Week 3 求第K大数 Selection

问题 给定N个元素的数组,求第k大的数. 特例当k=0时,就是求最大值,当k=N-1时,就是求最小值. 应用顺序统计求top N排行榜 基本思想 使用快速排序方法中的分区思想,使得a[k]左侧没有更小的数,右侧没有更大的数 性能 快速选择算法的复杂度是N. 最坏情况下的复杂度是1/2N^2,但是可以通过预先洗牌来防止出现最坏情况 public static Comparable select(Comparable[] a, int k) { StdRandom.shuffle(a); int l

普林斯顿大学算法课 Algorithm Part I Week 3 排序的应用 System Sorts

排序算法有着广泛的应用 典型的应用: 排序名称 排序MP3音乐文件 显示Google的网页排名的搜索结果 按标题顺序列出RSS订阅 排序之后下列问题就变得非常简单了 找出中位数(median) 找出统计数据中的异常值 数据库中的二分查找 在邮箱中找出重复的邮件 不是特别典型的应用: 数据压缩 计算机图形 计算生物 负载平衡 Java系统排序(System sorts) Arrays.sort(). 有不同的方法对应不同的基本类型 有一个实现Comparable接口的方法 有一个使用Compara

普林斯顿大学算法课 Algorithm Part I Week 3 自我总结

要熟练掌握比较器Comparator public final Comparator<T> MY_COMPARATOR = new myComparator(); //定义比较器 ..... public int comparaTo(T t){ ..... } private class myComparator implements Comparator<T>{ public int compare(T v, T w){ return v.comparaTo(w) //compa

普林斯顿大学算法课 Algorithm Part I Week 3 比较器 Comparators

比较器接口(Comparator interface):用可选顺序(alternate order)进行排序 public interface Comparator<key> int compare(Key v, Key w) //比较元素v和w 示例: Java系统排序(java system sort) 创建Comparator对象(Create Comparator object) 向Array.sort()传递第二参数 String[] a; ... Arrays.sort(); //