1 排序分治

Download Report

Transcript 1 排序分治

连线(Lining Up)
• 事实上,飞行员面临的可不是个简单的任
务。她要把物品空投到处于危险地带的一
些指定的地点。并且,飞行员只能按一条
直线飞过该区域一次,并尽可能多的飞越
指定地点。所有的地点都以坐标点的形式
标记在一个二维空间中。飞行员想知道这
些点中处于同一条直线上的点的最大数目
是多少。你能编写一段程序计算这个数 吗?
解题思路
• 以一个点为基点,对其它所有点连线,然
后对这些线的斜率进行排序,统计有多少
斜率相同的线。遍历每一个点,以其为基
点进行尝试,统计能得到的最大值。
• 斜率的计算最好不要用浮点数。两个斜率
m1/n1和m2/n2的比较,等价于abs(m1*n2)
和abs(m2*n1)的比较
区间(Intervals)
• 给定 n 个闭区间 [ai; bi],其中i=1,2,...,n。 这
些区间可以用一组不间断的闭区间表示。
我们的任务是找出其中区间数最少的表示,
并把它们按升序输出。所谓升序,即对于
区间[a;b] 和[c;d]是升序的,当且仅当a ≤ b <
c ≤ d。
解题思路
• 对所有区间进行排序,排序的原则是起点
在数轴靠上左的排在前面
• 左到右查看当前区间的终点是否超越下一
个区间的起点,如果是,则合并区间
建筑轮廓问题
• 对于城市中几座建筑外形,给出这些建筑
的二维轮廓。
解题思路
• 轮廓可用“区间+高度”来表示。两个轮廓
合并,需要两个轮廓同时从左到右遍历,
挑出每段区间的最高点,复杂度为O(n)。
• 程序整体的结构可参照归并排序,整体算
法复杂度为O(nLogn)
• 程序实现比较繁琐,需细心
木棒问题
• XX有n根长度不同的木棒,有一天它把所有的
木棒排成一行,用S1,S2,S3,...,Sn表示.量出每
个木棒的长度Sk(1<=k& lt;=n),它发现有两个
木棒Si和Sj(1< = i < j < = n),它们之间的所有木
棒都比Si要长比Sj短.
现在给出每个木棒的长度,你需要找到满足
上述条件的两个木棒Si和Sj,使得j-i最大.
(请使用分治法解此题)
解题思路
• 等价于求最长上升子序列
• 给出两个数组,A和B,已知A和B中的最长
上升子序列,那么A和B连接之后的最长子
序列需要从以下三个候选中挑出:A中最长
上升子序列、B中最上上升子序列、A尾部
的最长上升序列和B头部的最长上升序列的
合并。结合部的计算复杂度为O(n),整体复
杂度为O(nlogn)
斐波那契数
• 斐波那契数列是指如下数列: F(0)=0, F(1)=1,
F(n)=F(n-1)+F(n-2).数列的前10个数如下:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
对于给定的数n,请求出F(n)的后四个数字.
解题思路
F ( n) 
 F (n  1)

 F ( n)

F (n  1)

F (n  1)  1 1
 F ( n)
 F (n  1) F (n  2)  1 0

 

矩阵乘方和
• 给出一个n*n的矩阵和正整数k,请求出
S=A+A^2+A^3+A^4+...+A^k的值.A^x表示x个A
相乘的结果.
解题思路
• S(n) = A + A^2 + A^3 + ….. + A^n
• n为偶数
S(n) = S(n/2) + F * S(n/2)
F = A^(n/2)
• N为奇数
S(n) = A + A * S((n-1)/2) + F * S((n-1)/2)
F = A^((n-1)/2)
• 计算F时可利用计算S([n/2])时算得的F