第十课 分治法,合并排序,异常

2016-11-20

  • Search

  • 首先复习上节课的内容

  • Ordered - Binary

    Unordered - linear

    logN

    N

    n logn - to get order

    Amortize

    nlogn + logn

    n

    nlogn + klogn

    k*n

  • 简单复习下二分法

  • 二分法是一个简单的分治法的例子

  • Divide and conquer algorithm 分治法

    • split the problem into several sub-problems of the same type.

    • solve independently

    • combine solutions

  • 二分搜索法实际上是将问题分成两个,但是抛弃了另一个,这样结果合并也没有太大意义。所以子问题就是父问题的结果,但是这就是分治法的思想。

  • 要用这种思想来处理排序

  • Merge sort 归并排序 1945年 John von Neumann 约翰·冯·诺依曼发明

    • merge two lists 合并两个排序好的序列需要多少步骤?

    • [3,12,17,24] [1,2,4,30]

    • [1,2,3,4,12,17,24,30] 只需要比较7次

    • 只需要比较每一列的第一个,所以每次合并所需的复杂度是线性的

    • O(n) - n is sum of number of elements in each list

  • Merge sort

    • divide list in half

    • continue until we have singleton lists 直到我们拥有单个元素列表

    • Merge of the sublists

  • 现场演示归并排序 (飞鸿雪泥按:感觉很适合多线程并行使用)

  • 分治法要权衡在合并时需要的代价

  • 通过图形展示归并排序的算法时间复杂度是O(nlogn)

  • 概括一下

    • 解决问题的一标准方法是将问题分解成规模更小的相同问题,如果可以就可以用分治法

    • 要决定分成几份

    • 要决定分解到什么地方是可以解决的基本问题

    • 要决定如何合并

  • 适合分治法的问题是,可以简单分解并且合并过程不是非常复杂的问题

  • 最后一个算法 哈希算法 hashing

  • Hashing

    • 举个例子,整数集 collection of integer

    • 把每个整数直接放在对应的位置

    • 时间复杂度 O(1) 常数时间

    • 如果是字母,找一个哈希函数映射到数字

  • 核心就是将对象映射到数,访问时间为常量级

  • Trade space for time 以空间换时间

  • 如何保证哈希函数将任何输入映射到唯一存储空间去?

    • 答案是不能

  • 对于一个复杂问题,很难设计一个哈希函数具备完全平均的分配

  • 但应该尝试去设计,尽量让每一个点上的数据量很小

  • Hard to create

  • 简单对以前的三四节课总结

    • 介绍了算法类型

    • 希望你们知道如何做一些简单的算法复杂度分析

    • 如何根据算法的特点将其辨别出来并且知道它属于哪一类算法

    • 教给一套标准的算法

      • Rootforce 暴力的尝试每一种路径,规模小时,效率高。先猜测再验证

      • Successive approximation , 逐次逼近 Newton-Raphson迭代是一个好例子

      • Divide and conquer 分治法

    • 这些都在工具箱里,希望你能看到一个问题说出最适合解决这个问题的算法,并将问题映射到相应的案例里去

  • 谈谈Python语法里最后一个异常Exceptions

    • unhandled

    • handle

    • try - except block

  • Exception vs assert?

Exception

assert

处理不愿发生的事情

Pre-conditions 测试条件

post-coditions

  • 为什么有异常处理?

    • 如果有可能输入不是预期类型,需要异常,不希望有非预期的情况漏过去

    • 防止用户输入让程序陷入困难的情况

Last updated