最小比较次数问题的通用解法

题目:从N个无序数中找到最大数(或者:最大数和最小数、最大的前K个数),需要的最小比较次数。

思路:用递归公式。设N个数所需要的比较次数为F(N), 将比较过程划分成更小的部分。求递推公式的解。

划分的第一步永远是:分成N/2组一对一比较,形成两大阵营:胜者组败者组

题目一:从N个无序数中找到最大数

先分成N/2个胜者和N/2个败者,需要N/2的比较次数。然后从N/2规模的胜者组中找到最大值即可(即单淘汰制度)。这是一个递归关系:F(N)=N/2+F(N/2). 求解该方程可以得到:F(N)=N/2+N/4+N/8+...+1=N-1.

(因为无穷级数N/2+N/4+N/8+...=N,而该无穷级数从1之后的部分是1/2+1/4+1/8+...=1,所以N/2+N/4+N/8+...+1=N-1. )

即共需要N-1次比较。

题目二:从2N个无序数中同时找到最大值和最小值

先分成N个胜者和N个败者,需要N的比较次数,然后从N规模的胜者组中找到最大值,需要N-1次(题目一已经解出),从N规模的败者组中找到最小值,根据对称性也是N-1次,则由F(2N)=N+N-1+N-1=3N-2次比较。

题目三:从N个无序数中找到最大值和次大值

先分成N个胜者和N个败者,需要N的比较次数,然后从N/2规模的胜者组中找到最大值和次大值,需要F(N/2)次比较。再找到最大值对应的败者组里的对手,不需要比较次数,最后让胜者组的次大值和败者组里找出的该值比较,需要一次。所以有F(N)=N/2+1+F(N/2).

解出F(N)=(N/2+N/4+N/8+...+1)+(1+1+1+..+1(共logN-1个1))=N-2+logN. 该值为最少比较次数。

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最小循环子数组是指在一个循环数组中,找到一个连续子数组,使该子数组的和最小。对于解决这个问题,可以使用Java编程语言来实现。 首先,我们需要定义一个函数来计算数组的和。该函数的输入参数为一个整数数组,返回值为数组的总和。下面是该函数的Java代码实现: ```java public int getSum(int[] nums) { int sum = 0; for (int num : nums) { sum += num; } return sum; } ``` 接下来,我们可以编写一个函数来找到最小循环子数组的和。该函数的输入参数为一个整数数组,返回值为最小循环子数组的和。下面是该函数的Java代码实现: ```java public int findMinSubarraySum(int[] nums) { int sum = getSum(nums); int currentSum = 0; int minSum = sum; for (int i = 0; i < nums.length; i++) { currentSum += nums[i]; if (currentSum > sum) { currentSum = nums[i]; } minSum = Math.min(minSum, currentSum); } return minSum; } ``` 在这段代码中,我们使用了一个变量currentSum来记录当前子数组的和,另一个变量minSum来记录最小循环子数组的和。在遍历数组过程中,如果当前子数组的和大于整个数组的总和,就将currentSum重置为当前元素的值。每次更新minSum时,都使用Math.min函数来比较两个和的大小,并将较小的值赋给minSum。 最后,我们可以调用findMinSubarraySum函数来找到最小循环子数组的和。下面是一个例子: ```java int[] nums = {4, 3, -2, -1, -3, 4, 5}; int minSubarraySum = findMinSubarraySum(nums); System.out.println("最小循环子数组的和为:" + minSubarraySum); ``` 以上就是最小循环子数组问题的Java解法,通过以上的代码实现,可以计算出最小循环子数组的和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值