最大的数和最小的数、最大的两个数

恰当安排可以减少比较次数,见下。

求序列中最大数和最小数的时候,naive的做法(分别求)需要比较大约2n次。

更好的做法是:假设易知max和min是前k个元素的最大和最小,那么,将k+1与k+2先比较一下,然后,大的和max比,得到新的最大;小的和max比,得到新的最小。这样,每向后走两个元素,只需要三次比较,最终的比较次数大约是3n/2次。

 

求序列中最大的两个数,可以这么做:假设max1, max2是一个子集A的最大和次大元素,max3, max4是另一个子集B的最大和次大元素,那么,Union(A, B)的最大元素只可能是max1和max3中比较大的一个,假设max1>max3,那么次大元素只可能是max2和max3中的一个,而max4肯定已经落选了。因此,max4就不需要参与比较了。

有鉴于此,对于每次分治,可以对每个子集维护一个最大的元素和可能的第二大元素的集合,这样比较的时候,类似于上例中的max4集合就可以直接扔掉,不参与后续的比较。

这个第二大元素的候选集合,最终元素个数应该是logn级别的,之后,在这个候选集合里面走一遍,就得到第二大的元素了。

转载于:https://www.cnblogs.com/qsort/archive/2011/05/09/2041667.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 请问您需要我编写一个程序来解决这个问题,还是只需要一个算法来解决问题? 如果您只需要一个算法,可以使用以下步骤来解决问题: 1. 从输入中获取第一个字并将其保存为最大值和最小值。 2. 循环遍历剩余的字,如果当前字比最大值大,则更新最大值,如果当前字比最小值小,则更新最小值。 3. 循环结束后,最大值和最小值即为所需的结果。 如果您需要编写一个程序,请告诉我您使用的编程语言,我可以给您提供相应的代码示例。 ### 回答2: 假设我们有20个数,我们首先需要定义一个变量来存储最大值,再定义一个变量来存储最小值。开始时,可以将最大值初始化为负无穷大,将最小值初始化为正无穷大。 接下来,我们可以使用循环来逐个读取这20个数,并比较它们与当前最大值和最小值的大小。如果读取到的大于最大值,则更新最大值为该;如果读取到的小于最小值,则更新最小值为该。 最后,当循环结束时,我们就可以得到这20个数中的最大值和最小值。可以通过输出这个变量的值来展示最大值和最小值。 下面是代码示例: ```python max_num = float('-inf') # 初始化最大值为负无穷大 min_num = float('inf') # 初始化最小值为正无穷大 for i in range(20): num = int(input("请输入一个:")) # 读取一个 if num > max_num: max_num = num # 更新最大值 if num < min_num: min_num = num # 更新最小值 print("最大值为:", max_num) print("最小值为:", min_num) ``` 这段代码可以接受用户输入20个数,并输出其中的最大值和最小值。注意,在这段代码中,我们使用了`float('-inf')`和`float('inf')`来初始化最大值和最小值,因为它们分别表示负无穷大和正无穷大,保证了可以正确比较并更新最大值和最小值。 ### 回答3: 我们可以通过以下步骤来输入20个数,并找出其中的最大最小。 首先,定义个变量,分别用于存储最大最小的初始值。我们可以将最大的初始值设为负无穷大,而最小的初始值设为正无穷大。 然后,通过循环20次,每次输入一个,并将其与当前的最大最小进行比较。如果输入的大于最大,则更新最大的值;如果输入的小于最小,则更新最小的值。 最后,当循环结束后,我们就得到了输入的20个数中的最大最小。可以通过输出最大最小来得到结果。 下面是一个使用Python语言实现上述步骤的示例代码: ```python max_num = float("-inf") # 初始化最大为负无穷大 min_num = float("inf") # 初始化最小为正无穷大 for i in range(20): num = float(input("请输入第{}个数:".format(i+1))) if num > max_num: max_num = num if num < min_num: min_num = num print("最大为:", max_num) print("最小为:", min_num) ``` 你可以根据需求选择其他编程语言来实现相同的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值