第十二课 调试的更多内容,背包问题,动态规划简介

2017-02-09

  • 关于调试剩下的几个小点

    • 错误可能不是发生在你认为会发生的地方,如果是,你可能已经找到它了

    • 注意几件事

      • 自变量顺序 Reversed order of arguments

      • 拼写错误 Spelling

      • 初始化 Initialization , 循环开始的初始化

      • 对象与值比较 Object vs Value equality ==

      • Aliasing 别名混淆

        • Deep vs shallow copy 深复制和浅复制

      • Side effect 副作用 函数可能会修改实参值

  • 熟练的程序员会建立一个自己的犯错模型

    • 知道自己会犯什么错误

    • 多反省自己

    • 收集自己犯过是错误

    • 遇到错误首先想到这些错误

  • Keep record of what you tried 记录你尝试过的修改

    • 系统化编程 不在已经犯过的错误上浪费时间

  • Reconsider assumption 重新考虑你的假设

    • 例如运行的不是你在写的程序

  • Debug code, not comments 调试的是代码不是注释

  • Get help - Explain 寻求帮助,要会解释

  • Walk away 休息一会

  • 修改错误的注意点

    • Haste makes waste 欲速则不达

      • 方案是否能解决问题并不引起其他问题

    • Code should not always gain 代码不能总是增长

      • 清理代码,整理代码

    • Make sure that you can revert 保证可以回滚代码

      • Save old versions

  • 公式化问题的处理方法

  • Optimization problems 优化问题 优化问题一般有两个要点

    • A function to maximize(min) 要求出最大或最小值

    • A set of constrains 有一系列约束

    • 典型问题

      • 最短路径问题 shortest path

      • 旅行商问题 Traveling sales problem (TSP)

      • 装箱问题 Bin packing 装东西顺序之类的

      • Sequence alignment problem 序列对比问题 DNA,RNA,自然语言

      • Knapsack 背包问题

        • 判断要带多少东西,最大化价值

  • Problem reduction 问题规约 举这么多例子是为了让大家进一步考虑问题规约

  • 处理一个问题,将它归结映射到一个老问题(已经解决的问题),利用前人的成果

  • 下面看背包问题

  • 现在大部分优化问题都没有快速的解决方案

  • 目前只处理过亚线性问题,最多也就是多项式问题,这些不能处理背包问题

  • Continuous knapsack problem 连续背包问题

  • 问题描述

    • 你有一个 8lbs 的包

    • 4lbs Au dust 金沙

    • 3lbs Ag dust 银沙

    • 10lbs raisins 葡萄干

  • 如何系统化这个问题?

    • 求 Cg*PG + Cs*PS + Cr*PR 的最大值

    • 约束条件是PG+PS+PR < = 8

  • 解决方法很简单,4磅金沙,3磅银沙,1磅葡萄干

  • Greedy algorithm 贪婪算法 上面描述的其实是一种贪婪算法

    • 每一个步骤都在最大化你的价值,局部最优

  • 贪婪算法并不总是适用

  • Locally optinal decisions do not always lead to global optimum 局部最优不一定能得到全局最优

  • 变种 0/1 Knapsack problem 0/1 背包问题

    • n items 每个要么都拿要么不拿

    • 四个东西 手表,收音机,花瓶,画

  • 贪婪的贼 贪婪算法 先拿最有价值的

  • 动作慢的贼怎么做? 穷举

    • 想要最大值的函数是 ∑PiXi X是0/1向量

    • 约束函数是 ∑WiXi < = C 背包容量

    • 穷举法是指数级的 Exponential

  • Dynamic programming 动态编程 数学家Bellman发明的词,因为军方为了不让别人知道研究的是什么。。。

    • Overlapping subproblems 重叠子问题 又被叫作Optimal substructure 最理想子结构

  • 先看一个重叠子问题的例子,用递归解决Fibonacci数问题

    • 递归的方法,增长率很高

    • 里面重叠子问题也很多,求fib(5) 会调用 fib(4) fib(3),而求fib(4)又会调用fib(3) fib(2),这里fib(3)调用了2次,其他的也是

    • 下次课会看另一种解决方法,增长率会低很多

Last updated