分治策略——快速排序、幂乘算法、芯片测试、改进分治算法的途径

思想:用首元素作为划分标准,设定两个指针,分别从第二个元素和最后一个元素分别往前往后遍历。

当前指针找到大于标准、后指针找到小于标准的时候,互换两个指针处的元素。从而将问题划分为两个子问题。

在递归调用对子问题排序。

伪代码:

算法:QuickSort(A, p, r)
输入:数组A[p...r]   输出:排序后的数组
1.if(p<r)
2.x <- A[p]
3.i <- p  j <- r+1
4.while true do
5.    repeat j <- j--
6.    until A[j] <= x
7.    repeat i <- i++
8.    until A[i] >= x
9.    if i < j
10.    A[i] <-> A[j]
11.    else return j
12.A[p] <-> A[j]
13.QuickSort(A, p, j-1)
14.QuickSort(A, j, r)

时间复杂度分析

W(n) = W(n-1)+n-1      W(1) =0

当子问题划分均衡时,取到最好划分,时间复杂度为nlogn

平均时间复杂度O(nlogn)   最坏时间复杂度O(n^2)

 

幂乘算法

将问题划分为相等的两个子问题,由于两个子问题完全相同,故计算一次即可,减小计算量。

斐波那契数列:可以通过行列式的方法化简为幂乘算法。复杂度:O(n)  ->   O(logn)

 

芯片测试:

对好芯片比坏芯片多一片的情况适用。

将n片芯片两两分组,互相测试,只留下好好的结果。

伪码:

Test(n)
1.K <- n
2.while k>3 do
3.将芯片分为k/2组  //对n为奇数的情况增加轮空处理
4.for i = k to k/2 do
5.    if 两片好 留下一片  else 丢掉
6.k <- 剩下芯片数
7.if k = 3 then 任取两片测试
8.    if 1好1坏 then取未测的芯片
9.    else 任取一片被测
10.if k = 2 or 1 then 任取

时间复杂度:

W(n) = W(n/2) + O(n)    W(3) = 1, W(2)=W(1)=0

W(n) = O(n)

 

改进分治算法的途径

1、减少子问题数

W(n) = aW(n/b) + d(n)

当a较大,b较小,d(n)不大时,方程的解W(n)与n^logba 同阶

减少a是降低函数复杂度的途径。

2、增加预处理

分组等

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值