分治法求序列中的最大和次大元素
2024-04-10 10:20:04  阅读数 500

分治法是指将一个复杂的,规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题形式相同,递归的解这些子问题,然后将各子问题的解合并得到原问题的解的算法设计策略。

对于无序序列a[low...high],采用分治法求最大元素max1和次大元素max2的过程如下:

[if !supportLists](1)  [endif]若a[low...high]中只有一个元素,则max1 = a[low],max2 = -INF-(-oo)。

[if !supportLists](2)  [endif]若a[low...high]中只有两个元素,则max1 = max{a[low],a[high]},max2=min{a[low],a[high]}。

[if !supportLists](3)  [endif]若a[low...high]中有两个以上元素,按中间位置mid = (low + high)/2划分为a[low...mid]和a[mid + 1...high]两个区间(注意左区间包含a[mid]元素)。求出左区间的最大元素lmax1和次大元素lmax2,求出右区间的最大元素rmax1和次大元素rmax2。

若lmax1 > rmax1,则max1 = lmax1,max2 = max{lmax2,rmax1};否则max1 = rmax1,max2 = max{lmax1,rmax2}。

例如:

    对于a[0...4] = {5,2,1,4,3},mid = (0 + 4)/2 = 2,划分为左区间a[0...2] = {5,2,1},右区间a[3...4] = {4,3}。在左区间中求出lmax1 = 5,lmax2 = 2,在右区间中求出rmax = 4,rmax2 = 3。所以max1 = max{lmax1,rmax1} = 5,max2

= max{lmax2,rmax1} = 4。

对于solve(a,0,n-1,max1,max2)调用,假设其执行时间为T(n),当n=1或2时,起执行此数为1,当n>2时,不断分解n并递归调用其solve方法,直至n=1或2,其比较次数的递推式如下:

T(1) = T(2) = 1

T(n) = 2T(n/2) + 1             //n>2,合并的时间为O(1)

可以推导出T(n) = O(n)。