Median-finding算法
已经有账户了吗?<一个href="//www.parkandroid.com/account/login/?next=/wiki/median-finding-algorithm/" class="ax-click" data-ax-id="clicked_signup_modal_login" data-ax-type="link">日志在这里。一个>
Median-finding算法(也称为线性时间选择算法)使用<一个target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/divide-and-conquer/">分而治之一个>策略的高效计算
Median-finding算法
中值查找算法解决的问题如下:
给一个数组
这个问题当然可以用<一个target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/sorting-algorithms/">排序算法一个>方法对数字列表进行排序并返回值
gydF4y2Ba在实践中,中值查找算法是用<一个href="//www.parkandroid.com/wiki/randomized-algorithms/" class="wiki_link" title="随机算法gydF4y2Ba" target="_blank">随机算法一个>有一个期望的线性运行时间。然而,本维基将关注中位数的中位数算法,这是一个在线性时间内运行的确定性算法。
Median-of-medians算法
中位数的中位数算法是一种确定的线性时间选择算法。该算法的工作原理是将一个列表划分为子列表,然后确定每个子列表中的近似中值。然后,它把这些中位数放到一个列表中,然后找到这个列表的中位数。它用这个中值作为
Median-of-medians算法[1]一个>
该算法包含一个列表和一个索引
将列表分成长度为5的子列表(如果最后一个列表可用的元素少于5个,则没问题)。
对每个子列表排序并确定中值。对非常小的列表进行排序需要线性时间,因为这些子列表有5个元素,这需要
使用中位数的中位数算法递归地确定所有中位数集合的中位数。
用这个中值作为主元,
重新排序
7gydF4y2Ba个。如果
展示中位数中的中位数算法寻找列表中第三低分数的步骤,
一个 考试成绩。gydF4y2Ba注意:该算法的一些实现,比如下面的实现,是零索引的,这意味着
0 th最低分将是列表中的最低分。在本例中,使用零索引—因此第三个最低分数将是4 th元素从排序列表的左边开始。
一个 =[25,21,98,100,76,22,43.,60,89,87]首先,我们将列表分解为五个元素:
一个 1=[25,21,98,100,76]而且一个2=[22,43.,60,89,87].每个列表:
一个 1=[21,25,76,98,100]而且一个2=[22,43.,60,87,89].然后,从每个列表中取出中位数,并将它们放入中位数列表中,
米 :米=[76,60].
排序:
米 =[60,76].从列表中选择中位数——因为列表的长度是2,我们用列表的长度除以2来确定中位数的下标:我们得到
2 2=1,中位数指数为1,M[1] = 76。gydF4y2Ba用它作为主元,把所有元素都放进去
一个 左边小于76,右边大于76的元素:
一个 ”=[25,22,43.,60,21,76,100,89,87,98].求76的指数,也就是5。5和3相比怎么样?自
5 >3.,我们必须对列表的左半部分进行递归一个 ”,这是[ 25,22,43.,60,21].gydF4y2Ba这个列表只有5个元素长,所以我们可以对它进行排序,找出索引3的元素:
[ 21,22,25,43.,60]43在下标3处。43gydF4y2Ba是第四个最小的数
一个 .□
中值查找算法的实现
下面是中位数算法的Python实现
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
注意,这里引用的源代码没有完全正确的实现,但确实启发了这个(更好的)实现。
假设您想使用上面的实现来查找
我 th最大元素一个 而不是我 th最小。为了实现这一点,您可以对实现(而不是函数的输入)进行哪些更改?
交换低 而且高 在分划步骤中
1 2高=[j为j在一个如果j<主]低=[j为j在一个如果j>主]
进行更改并使用以下测试用例进行测试:
1 2 3 |
|
现在尝试下一个例子,看看如何通过仔细选择一个元素来找到最大的元素
您可以在上面的原始实现中输入什么来查找列表中最大的元素?
列表中最大的元素总是“最小的”元素。例如,在长度列表中1 0,列表中最小的元素是第九小的元素(记住零索引,第0小的元素是最小的元素)。更一般地,要查找列表中最大的元素,调用median_of_medians (len (A) (1) .gydF4y2Ba用下面的测试用例进行测试:
1 2 3 4 5D=[1,2,3.,4,5,6]# 6是D中最大(最小)的元素打印median_of_medians(D,len(D)-1)E=[9,5,4,3.]#9是E中最大(最小)的元素打印median_of_medians(E,len(E)-1)
你如何选择
我 值,以便您可以找到我 th最大的价值一个 不修改原始实现本身?
的值
我 变量会len(A) - x - 1\) ,在那里x 是数量x th你想要找到的最大值。□