一、已知下列递推式:

\[C(n)=
\begin{cases}
1 & , & n = 1 \\
2C(n/2) + n - 1& , & n \geq 2
\end{cases}
\]

请由定理1 导出C(n)的非递归表达式并指出其渐进复杂性.

定理1:设\(a,c\)为非负整数,\(b,d,x\)为非负常数,并对于某个非负整数\(k\), 令\(n=c^k\), 则以下递推式

\[f(n)=
\begin{cases}
d & , & n=1 \\
af(n/c)+bn^x& , & n\geq2
\end{cases}
\]

的解是

\[f(n)=
\begin{cases}
bn^xlog_cn + dn^x & , & n=1 \\
\left( d + \frac{bc^x}{a-c^x} \right)n^{log_ca} - \left( \frac{bc^x}{a-c^x}\right)n^x& , & n\geq2
\end{cases}
\]

令 \(T(n) = C(n) - 1\),则

\[T(n)=
\begin{cases}
0 & , & n = 1 \\
2T(n/2) + n & , & n \geq 2
\end{cases}
\]

则\(T(n)\)满足定理1中递推式,且\(a = 2, b = 1, c = 2, d = 0, x = 1\), 即有\(2 = 2^1\)

故当\(n = 2^k\)时,\(T(n)\)的解为

\[T(n) = nlog_2n
\]

则\(C(n)\)的非递归表达式为

\[C(n) = T(n) + 1 = nlog_2n + 1
\]

所以其渐进复杂性为\(\Theta(nlog_2n)\)

二、由于Prim算法和Kruskal 算法设计思路的不同,导致了其对不同问题实例的效率对比关系的不同。请简要论述:

1、如何将两种算法集成,以适应问题的不同实例输入;

Prim算法基于每个点, 要遍历所有的点。

Kruskal算法基于边, 要遍历许多边。

因此可以在边比较稀疏的情况下用Kruskal算法,在边较稠密的情况下使用Prim算法.

2、你如何评价这一集成的意义?

​ 通常实现下Prim是\(O(V^2)\)的时间复杂度,但可以使用优先队列将时间复杂度优化到\(O(Elog_2V)\),而Kruskal使用排序+并查集实现的复杂度为\(O(Elog_2E)\),两者最优时间复杂度差别仅为log级别的,且Prim平均情况下效果会更好。因此这一集成大概只是增加了代码复杂度,仅用Prim算法的效果可能会更好。

三、分析以下生成排列算法的正确性和时间效率:

HeapPermute(n)
//实现生成排列的Heap算法
//输入:一个正整数n和一个全局数组A[1..n]
//输出:A中元素的全排列
if n = 1
write A
else
for i ← 1 to n do
HeapPermute(n-1)
if n is odd
swap A[1] and A[n]
else swap A[i] and A[n]

1. 正确性

设 k 为正整数且 $ k \leq n\(,记\)A[1..n]\(为\)A=[a_1, a_2, \cdots, a_n]$

我们有以下结论:在执行算法\(HeapPermute(k)\)后, 输出 A 前 k 位的全排列,后\(n − k\)位不变。(特别地, 当 k = n 时, 输出的就是 A 的全排列。) 执行算法\(HeapPermute(k)\)前后, 当 k 为奇数时, A 保持不变;当n为偶数时, A 的前 k 位循环右移一位。

下面数学归纳法证明该结论:

证明

  • (1) 当\(k = 1\)时,算法\(HeapPermute(k)\)输出\([a_1, a_2, \cdots, a_n]\),与结论相符。
  • (2) 假设当$k = 2j - 1(j \(为正整数\))\(,且\)k < n \(时,执行\)HeapPermute(k)\(输出 A 前 k 位的全排列,后\)n − k\(位不变,且A保持不变。则当\)k = 2j\(时,对于\)i = 1, 2, \cdots, 2j$时,分别输出A的前\(2j-1\)位的全排列,A的后\((n - 2j + 1)\)位不变,程序向下执行到第10行,由于n为偶数,则\(swap(a_i,a_{2j})\)。之前所有操作仅改变A数组的前\(2j\)位,然后输出\(2j - 1\)位,后后\((n - 2j + 1)\)位不变。最后依次将A的第\(1, 2, \cdots, 2j\)位交换到第2m位。因此上述操作得到了A的前2j位的全排列且前2j位循环右移一位,后\(n-2j\)位不变。与结论相符。
  • (3) 假设当$k = 2j(j \(为正整数\))\(,且\)k < n\(时,,执行\)HeapPermute(k)\(输出 A 前 k 位的全排列,后\)n − k\(位不变,且 A 的前 k 位循环右移一位。类似的可得到当\)k=2j+1$时, A 保持不变。

因此结论得证,执行算法HeapPermute(n)可以输出全局数组\(A = [1..n]\)的全排列。

2. 时间效率

考虑交换操作的耗时,有递推公式如下:

\[T(n)=
\begin{cases}
1 & , & n = 1 \\
n\left[T(n - 1) + 1\right] & , & n \geq 2
\end{cases}
\]

化简得\(T(n) = n! + O(n^{n-1})\)

故\(T(n)\)的时间复杂度为\(O(n!) + O(n^{n-1})\)

四、对于求n 个实数构成的数组中最小元素的位置问题,写出你设计的具有减治思想算法的伪代码,确定其时间效率,并与该问题的蛮力算法相比较。

FindMin(n)
//实现寻找数组中最小元素的位置
//输入:一个正正整数n和一个全局数组A[1..n]
//输出:A中最小元素m及其位置a
if n == 1:
return A[1], 1
else
m, a = FindMin(n-1)
if m <= A[n]:
return m, a
else
return A[n], n

上述减治方法每次将问题的规模约减1,因此时间复杂度为\(O(n)\),与该问题的蛮力算法时间复杂度相同。

五、请给出约瑟夫斯问题的非递推公式 J(n),并证明之。其中,n 为最初总人数,J(n) 为最后幸存者的最初编号。

约瑟夫问题的非递推公式为:

\[J(n) = 1 + 2(n - 2^{\lfloor log_2n \rfloor}), \ n = 1, 2, 3, \cdots
\]

令\(m = {\lfloor log_2n \rfloor}\),\(l = n - 2^m,\)则\(J(n) = 2l+1\)

首先我们很容易知道该问题的通项公式为

\[\begin{array}{l}
J(2n) = 2J(n) - 1 & , & n 为偶数 \\
J(2n + 1) = 2J(n) + 1 & ,& n为奇数
\end{array}
\]

下用归纳法证明该通项。

证明

  1. 当\(n = 1\)时,上式显然成立。
  2. 假设\(n\)是偶数,取\(m_1、l_1\)使得\(n/2=2^{m_{1}}+l_{1}\),且\(0\leq l_{1}<2^{{m_{1}}}\)。这里\(l_{1}=l/2\)。我们有\(f(n)=2f(n/2)-1=2((2l_{1})+1)-1=2l+1\),其中第二个等式从归纳假设推出。
  3. 假设\(n\)是奇数,则我们选择\(l_{1}\)和\(m_{1}\),使得\((n-1)/2=2^{{m_{1}}}+l_{1}\),且\(0\leq l_{1}<2^{{m_{1}}}\)。注意\(l_{1}=(l-1)/2\)。我们有\(f(n)=2f((n-1)/2)+1=2((2l_{1})+1)+1=2l+1\),其中第二个等式从归纳假设推出。证毕。

综上,对所有的自然数n,原结论成立。证毕。

Algorithm homework 1的更多相关文章

  1. hdu-1789-Doing Homework again

    /* Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU 1789 Doing Homework again (贪心)

    Doing Homework again http://acm.hdu.edu.cn/showproblem.php?pid=1789 Problem Description Ignatius has ...

  3. Doing Homework 状态压缩DP

    Doing Homework 题目抽象:给出n个task的name,deadline,need.  每个任务的罚时penalty=finish-deadline;   task不可以同时做.问按怎样的 ...

  4. hdoj 1789 Doing Homework again

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. cf437A The Child and Homework

    A. The Child and Homework time limit per test 1 second memory limit per test 256 megabytes input sta ...

  6. HDU1789(Doing Homework again)题解

    HDU1789(Doing Homework again)题解 以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定任务分数和其截止日期,每日可完成一任务,输出当罚分尽可能小时 ...

  7. I - Doing Homework again

    I - Doing Homework again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  8. Codeforces Round #250 (Div. 2)—A. The Child and Homework

         好题啊,被HACK了.曾经做题都是人数越来越多.这次比赛 PASS人数 从2000直掉 1000人  被HACK  1000多人! ! ! ! 没见过的科技啊 1 2 4 8 这组数 被黑的 ...

  9. HDU1789Doing Homework again(贪婪)

    HDU1789Doing Homework again(贪心) 题目链接 题目大意:给你n们作业的最后期限和过了这个期限没做须要扣的分数.问如何安排能够使得扣分最少. 解题思路:贪心,将扣分多的作业排 ...

随机推荐

  1. 企业网络拓扑MSTP功能实例(二)

    组网图形 MSTP简介 以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路.但是使用冗余链路会在交换网络上产生环路,引发广播风暴以及MAC地址表不稳定等故障现象,从而导致用户通信质量 ...

  2. MFC常用函数

    1.MFC的常用函数(只是找了些经常使用的,这里没有的可以CSDN查找,不需要都记住,经常使用自动就会记得) 1)GetDlgItemText(ID ,str)作用: 对话框中获取文本第一个参数为要获 ...

  3. Java面试那些事

    网址链接:https://mp.weixin.qq.com/s/BkiDwyjua4iwws7gWHwK9Q 引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试 ...

  4. 来吧,展示!SpringBoot OSS 整合全过程,没见过比这更详细的了

    前言 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.其数据设计持久性不低于 99.9999999999%(12 ...

  5. Guitar Pro 7教程之打开播放文件的操作技巧

    前面的章节我们讲过了很多关于Guitar Pro的相关教程,由于最近{cms_selflink page='index' text='Guitar Pro'} 7中文版刚上新没多久,很多玩吉他的小伙伴 ...

  6. MathType输入几何符号的技巧

    通过学习几何学的知识,我们发现其中包含的几何符号有很多,比如有表示图形的符号,如三角形,平行四边形,圆,角,圆弧等:还有表示位置关系的符号,如平行,垂直等:还有表示矢量等其他符号,那么MathType ...

  7. 找回消失的IDM嗅探下载浮动条的方法

    我们之前讲了IDM资源嗅探的下载浮动条的设置方法,然而在有些时候,这个下载浮动条无法正常显示出来,影响了下载体验,这个问题该如何解决呢? 1.安装IDM扩展程序 一般来说,在IDM安装完成后,会在浏览 ...

  8. 两种方式教你搞定在mac中格式化磁盘的问题

    mac怎么格式化u盘?想必这是大部分苹果用户都会关心的一个问题.格式化u盘在我们日常工作中算是一个比较常规的操作了.但是在mac中随着系统版本不一样,格式化的方式也略有差别.今天,小编将以Mac OS ...

  9. Tuxera Disk Manager轻松解决硬盘格式转换问题

    生活中经常会遇到硬盘格式转换的问题,很多小伙伴都不知道怎么进行操作,特别是Mac小白们.今天,小编想要给不熟悉Mac系统的小伙伴推荐一款专业且高效的磁盘管理工具--Tuxera NTFS,可以帮助我们 ...

  10. MGR(MySQL Group Replication)部署测试

    1. 环境说明 192.168.11.131 mgr1 主节点 192.168.11.132 mgr2 从节点 192.168.11.133 mgr3 从节点 2. 在mgr1.mgr2.mgr3上安 ...