金块算法

2007年12月13日 | 分类: 学习记录 | 标签:

有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块。

假设袋中有n 个金块。可以用函数M a x(程序1 – 3 1)通过n-1次比较找到最重的金块。找到最重的金块后,可以从余下的n-1个金块中用类似的方法通过n-2次比较找出最轻的金块。这样,比较的总次数为2n-3。程序2 – 2 6和2 – 2 7是另外两种方法,前者需要进行2n-2次比较,后者最多需要进行2n-2次比较。

下面用分而治之方法对这个问题进行求解。当n很小时,比如说, n≤2,识别出最重和最轻的金块,一次比较就足够了。当n 较大时(n>2),第一步,把这袋金块平分成两个小袋AB。第二步,分别找出在AB中最重和最轻的金块。设A中最重和最轻的金块分别为HA LA,以此类推,B中最重和最轻的金块分别为HB LB。第三步,通过比较HA HB,可以找到所有金块中最重的;通过比较LA LB,可以找到所有金块中最轻的。在第二步中,若n>2,则递归地应用分而治之方法。

假设n= 8。这个袋子被平分为各有4个金块的两个袋子AB。为了在A中找出最重和最轻的金块,A中的4个金块被分成两组A1和A2。每一组有两个金块,可以用一次比较在A中找出较重的金块HA1和较轻的金块LA1。经过另外一次比较,又能找出HA 2和LA 2。现在通过比较HA1和HA2,能找出HA;通过LA 1和LA2的比较找出LA。这样,通过4次比较可以找到HA LA。同样需要另外4次比较来确定HB LB。通过比较HA HBLA LB),就能找出所有金块中最重和最轻的。因此,当n= 8时,这种分而治之的方法需要1 0次比较。如果使用程序1 – 3 1,则需要1 3次比较。如果使用程序2 – 2 6和2 – 2 7,则最多需要1 4次比较。设c(n)为使用分而治之方法所需要的比较次数。为了简便,假设n是2的幂。当n= 2时,c(n) = 1。对于较大的nc(n) = 2c(n/ 2 ) + 2。当n是2的幂时,使用迭代方法(见例2 – 2 0)可知

c(n) = 3n/ 2 – 2。在本例中,使用分而治之方法比逐个比较的方法

少用了2 5%的比较次数。

//思考:其原因在于要同时找出最大和最小的量。通过这样的分类,在末端的时候通过一次比较就能够把最大和最小同时求出。如果利用其他算法无法同时得到。

Technorati 标签:
目前还没有任何评论.
注意: 评论者允许使用'@user:'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC:'(不包括单引号)将会自动将您的评论发送给ABC。请务必注意user必须和评论者名相匹配(大小写一致)。