算法作业

作业来自于MOOC《算法设计与分析》(张德富 曾华琳)

本课程主要介绍算法设计与分析的基本方法以及算法复杂性理论基础。通过本课程的学习,要求学生理解并熟练掌握递归与分治法、贪心法、动态规划方法、回溯法、分支定界法,以及高级图论算法、线性规划算法等,理解并掌握算法复杂性的分析方法、NP完全性理论基础等计算复杂性的基本知识及完备性证明概要。

第一周作业–算法概述及复杂性理论

  1. 给定一个算法,其输入是一个整数集S和一个整数m,输出是和为m的所有S的子集,算法步骤如下:(1)列出S的全部子集,求他们的和。(2)逐个查看步骤(1)列出的子集,把每个和等于m的子集输出。
    上述算法是否满足算法特点?说明理由。

满足有穷性、确切性、输入项、输出项和可行性。
因为S的子集个数是有限个,所以该算法总会在有限个步骤之后终止,所以满足有穷性;
该算法的步骤定义清楚,是计算机可以实现的步骤,所以满足确切性;
该算法的输入项为0,满足输入项;
该算法的输出为和等于m的子集,满足输出项;
该算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,满足为有效性。

  1. . 利用循环不变量证明下述计算a^n算法的正确性:
Exp(a,n)
    i<-1
    pow<-1
    while i<=n do
         pow<-pow*a
         i<-i+1
    return pow

循环不变量:pow=a^(i-1)

初始步:循环开始之前,i=1,pow=1,a^0=1=pow,如果n=0,则不循环,返回1。若n=1,则循环一次,pow=a,满足要求

迭代:假设第k次迭代后,循环不变量满足要求,此时 p o w = a k , i = k + 1 pow=a^k , i=k+1 pow=ak,i=k+1
第k+1次迭代时, p o w = p o w ∗ a = a k + 1 , i = i + 1 = k + 2 pow=pow*a=a^{k+1}, i=i+1=k+2 pow=powa=ak+1,i=i+1=k+2,此时 a i − 1 = a k + 1 = p o w a^{i-1}=a^{k+1}=pow ai1=ak+1=pow,满足要求

终止: p o w = a n , i = n + 1 , 所 以 a i − 1 = a n = p o w pow=a^n,i=n+1,所以a^{i-1}=a^n=pow pow=an,i=n+1,ai1=an=pow,满足要求

  1. 设有两个在同一机器上实现的算法,运行时间分别为 100 n 2 和 2 n 100n^2和2^n 100n22n。当n取何值时,前者比后者快?
    由计算得:当n等于15时,100n2等于22500,2n=32768,前者比后者快

第二周作业–算法分析方法

1.对某个数据结构执行一个具有n个运算的序列。如果i为2的整数幂,则第i个运算的费用为i否则为1.使用合计方法确定每次运算的分摊费用。

C i C_i Ci为第i步实际的代价,则
∑ i = 1 n C i ≤ n + ∑ j = 0 l o g   n 2 j = n + ( 2 n − 1 ) < 3 n \sum_{i=1}^nC_i \leq n+ \sum_{j=0}^{log \ n}2^j = n+(2n-1) <3n i=1nCin+j=0log n2j=n+(2n1)<3n
所以每次分摊费用为 O ( 1 ) O(1) O(1)

  1. 用势能方法分析上题。

定义 C i C_i Ci为分摊代价, c i c_i ci为实际代价。设 i = 2 j + k i=2^j+k i=2j+k,定义第i个操作Di的势函数 Φ ( D i ) = 2 ∗ k 。 Φ(D_i)=2*k。 Φ(Di)=2k
当k=0时,实际代价 c i = i c_i=i ci=i, 这 时 i − 1 对 应 的 k 为 : 2 j − 2 j − 1 − 1 这时 i-1对应的k为: 2^j-2^{j-1}-1 i1k:2j2j11
所以
C i = c i + Φ ( D i ) − Φ ( D i − 1 ) = i + ( 0 − 2 ( 2 j − 2 j − 1 − 1 ) ) = i − ( 2 j ( 2 − 1 ) − 2 ) = i − i + 2 = 2 \begin{aligned} C_i &=c_i+Φ(D_i)-Φ(D_{i-1}) \\ &=i+(0-2(2^j-2^{j-1}-1)) \\ &=i-(2^j(2-1)-2) \\&=i-i+2 \\&=2 \end{aligned} Ci=ci+Φ(Di)Φ(Di1)=i+(02(2j2j11))=i(2j(21)2)=i

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值