算法导论8-4

问题:n个红色水壶和n个蓝色水壶,相同颜色水壶可盛的水都不一样多,但每一个红色水壶都有一个对应的蓝色水壶,二者可盛的水一样多。不同颜色的水壶可以互相比较判断可盛的水是否一样多。但是相同颜色的水壶不能相互比较。设计一个随机算法,其期望的比较次数为O(nlgn).

思路:红色水壶和蓝色水壶比较,可在找到与其容量一样多的蓝色水壶的同时将剩下的蓝色水壶分为两组:容量比它大的和容量比它小的;

            利用找到的相同容量的蓝色水壶可以反过来与剩下的红色水壶比较,将红色水壶也分为两组:容量比它大的和容量比它小的;

伪代码:

Match(RED,BLUE,p,r)
1.let C[p,...,r] be a new array//记录配对信息 
2.if RED.length==1
3.	C[p]=p
4.i=random(p,r)
5.q=FAST-SORT(BLUE,p,r,RED[i])//以RED[i]为主元快排BLUE			
6.FAST-SORT(RED,p,r,BLUE[q])//以BLUE[q] 为主元快排RED 		 
7.Match(RED,BLUE,p,q-1) 	
8.Match(RED,BLUE,q+1,r)	


你可能感兴趣的:(算法导论)