Algorithm 使用分治法从给定列表中查找第二小数

Algorithm 使用分治法从给定列表中查找第二小数,algorithm,math,Algorithm,Math,我正在努力解决这个问题 给定一个n个数字的列表,我们想找到最小的和第二小的 名单上的数字。描述一个分治算法来解决这个问题。假设n=2^k表示整数k。使用您的算法进行比较的次数应该是 不超过3n/2− 2,即使在最坏的情况下 我目前的解决方案是使用select算法获得中值,然后将列表划分为L1包含小于或等于中值的元素,R中值,L2包含大于中值的所有元素。对吗?如果是这样,我下一步该怎么做?请注意,中值选择算法使用的是Θn比较,但这并不意味着它最多使用3n/2-2比较。事实上,我认为它使用了更多,这

我正在努力解决这个问题

给定一个n个数字的列表,我们想找到最小的和第二小的 名单上的数字。描述一个分治算法来解决这个问题。假设n=2^k表示整数k。使用您的算法进行比较的次数应该是 不超过3n/2− 2,即使在最坏的情况下


我目前的解决方案是使用select算法获得中值,然后将列表划分为L1包含小于或等于中值的元素,R中值,L2包含大于中值的所有元素。对吗?如果是这样,我下一步该怎么做?

请注意,中值选择算法使用的是Θn比较,但这并不意味着它最多使用3n/2-2比较。事实上,我认为它使用了更多,这可能排除了您的解决方案策略

作为一个提示:把这个问题看作是为所有2k建立一个淘汰赛;每一轮的获胜者——两个数字中的较小者——进入下一轮。要实现这一点,需要进行多少比较?接下来,请注意,第二个最小的数字一定输给了最小的数字。第二小数也是输给最小数的最小数。考虑到这一点,你能有效地找到第二个最小的数字吗


希望这有帮助

哦,我只是用Python理解它:

def 2_minar: n=lenarr 如果n=2:OOP,我们不认为这是比较,对吧?
如果arr[0]这种朴素的方法可以很好地工作:与当前最低的比较,可能与当前最低的比较3/2*N比较预期。@wildplasser我同意这样的预期时间是好的,但声明特别要求最坏情况下的性能。最坏的情况可能是[0,x,x,x,x,x,x],在这种情况下,您必须为超过0的每个元素检查最低值和次最低值。它也不是分而治之。@OP您当前的解决方案是完全正确的:只要继续像那样划分列表,并继续使用较小的元素对子列表进行操作。基本上对L1进行递归调用,直到L1最终成为仅包含2个元素的列表。请注意,这与使用quickselect算法k=2结合中值算法来选择轴非常相似。关于这个方法有很多信息,而且它很容易实现。唯一困难的部分是理解子例程分区是如何工作的。它也是丢失到最小数的最大数。-我想你的意思是,第二个最小的数字是输给最小的数字的最小数字。谢谢,我实际上没有在你的帖子中得到这个想法。好的,这个提纲怎么样:如果n==2,比较并返回第一个、第二个最小的数。如果n>2最小值=calli=1到n/2,最小值2=calli=n/2到n,并返回最小值。。。这行吗?@Faisal-你如何从两半中返回最小值?另外,如果你不理解我的帖子,也许我应该编辑它。有什么特别的东西你没有得到吗?@Faisal-没有,没有。你知道如何为2^n名玩家组织一场比赛,以便确定总冠军是谁吗?不幸的是,我不知道如何为2^n名玩家组织一场比赛。非常感谢你的帮助。
total_comparisons = n/2 + (n/4 + n/8 + ... + 1) + (n/2 - 1)
                  = (n - 1) + (n/2 - 1)
                  = 3n/2 - 2