计算复杂度(Computational complexity):用于研究解决特定问题X的算法效率的框架

计算模型(Model of computation):可允许的操作(Allowable operations)

成本模型(Cost model):操作数(Operation counts)

复杂度上界(Upper bound):保证能在一定的时间内解决

复杂度下界(Lower bound):通过数学方法证明,必须花费的最少时间

最优算法(Optimal algorithm):可能达到的最小复杂度的算法(Algorithm with best possible cost guarantee for X),通常介于复杂度上界和下界之间

举例:排序

决策树模型:

有三个不同的元素a b c,通过比较的方式来得出排序结果。那么它的决策树为下图所示

树的高度代表了最差情况下需要比较的次数。
树的宽度代表了可能的排列顺序。

命题

任何基于比较的排序算法在最坏情况下至少要lg(N!) ~ N lgN 次比较。

证明

  1. 假设数组由N个不同的值组成,从a1到an
  2. 最坏情况由决策树的高度决定
  3. 二叉树最多可能的叶子节点数是2^h
  4. 因为数组有N!中不同的排序方式,所以至少有N!个叶子节点

结论

计算模型:决策树(decision tree

成本模型:比较(compares)

上界:使用归并排序可以达到NlgN复杂度

下界:NlgN

最优算法:归并排序

归并算法的时间上界达到排序算法的时间下界;但耗费过多内存空间,从内存占用方面来讲并不是最优的。

影响排序复杂性的因素

  • 输入的起始顺序

    • 如果输入较为有序,则我们可能不需要NlgN次的比较(在数组完全有序的情况下,插入排序只要比较N-1次)
  • 重复元素
    • 如果输入带有重复元素,则我们可能不需要NlgN次的比较(使用3路快排(3-way quicksort))
  • 元素的数字属性(Digital properties of keys):我们可以用数字/特征比较(digit/character compares)来代替值比较(key compares)对数字和字符串进行比较

基于这些因素,可以根据数据的性质,来选择合适的排序算法。       

普林斯顿大学算法课 Algorithm Part I Week 3 排序算法复杂度 Sorting Complexity的更多相关文章

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

    排序算法有着广泛的应用 典型的应用: 排序名称 排序MP3音乐文件 显示Google的网页排名的搜索结果 按标题顺序列出RSS订阅 排序之后下列问题就变得非常简单了 找出中位数(median) 找出统 ...

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

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

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

    发明者:Sir Charles Antony Richard Hoare 基本思想: 先对数据进行洗牌(Shuffle the array) 以数据a[j]为中心进行分区(Partition),使得a ...

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

    起源:冯·诺依曼最早在EDVAC上实现 基本思想: 将数组一分为(Divide array into two halves) 对每部分进行递归式地排序(Recursively sort each ha ...

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

    很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路 ...

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

    问题 给定N个元素的数组,求第k大的数. 特例当k=0时,就是求最大值,当k=N-1时,就是求最小值. 应用顺序统计求top N排行榜 基本思想 使用快速排序方法中的分区思想,使得a[k]左侧没有更小 ...

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

    要熟练掌握比较器Comparator public final Comparator<T> MY_COMPARATOR = new myComparator(); //定义比较器 .... ...

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

    比较器接口(Comparator interface):用可选顺序(alternate order)进行排序 public interface Comparator<key> int co ...

  9. 普林斯顿大学算法课 Algorithm Part I 学习资源

    网友笔记参考 果壳Mooc首页 revilwang的专栏 白色咖啡 Weiran Liu的渣技术小专栏 Bug表:http://findbugs.sourceforge.net/bugDescript ...

随机推荐

  1. 程序A+B问题(一次输入和多次输入)

    这是早就会写的题,把它整理一下,比较容易. ➀一次输入数据,计算A+B   #include<stdio.h> #include<stdlib.h> int main() { ...

  2. Git学习03 --远程仓库

    把本地库的内容推送到远程(github), 用git push命令,实际上是把当前分支master推送到远程. 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的 ...

  3. Matalab之模糊KMeans实现

    这节继续上节的KMeans进行介绍,上节主要是对模糊KMeans方法的原理做了介绍,没有实践印象总是不深刻,前段时间有个师姐让我帮着写了个模糊KMeans的算法,今天就拿她给出的例子来对这个方法做个实 ...

  4. Win7 64 bit 激活工具

    下载地址:http://www.3987.com/xiazai/1/18/35487.html 一键运行,重启就激活了,简洁方便!

  5. CSS Transform让百分比宽高布局元素水平垂直居中

    很早以前了解过当元素是固定宽度和高度的时候,水平垂直高居中的方法可以设置margin的负值来使其居中,这个负值是元素的宽和高的一半,比如宽高是100px,那么就用margin-left:-50px;m ...

  6. SQL语句优化(转摘)

    (1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最 ...

  7. python基础之 sys.argv[]用法

    sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始. arg[1]表示第一个命令行参数 arg[1][2:] 表示取第一个命令行参数,但是去掉前两 ...

  8. UVa 1583 - Digit Generator

    A+A的每一位的数字的和=B 问你每一个B对应 的最小的A 是多少 不然输出0: #include <cstdio> #include <iostream> #include ...

  9. const与重载

    转载自CSDN博客:http://blog.csdn.net/polarbearboy/article/details/6762752   (由于该作者也属于转载,不知原出处) PS:我们很易对下面这 ...

  10. python正则表达式基础篇

    1.正则表达式基础 1.1简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...