分治法寻找第k小元素算法的优化

分治法寻找第k小元素算法的优化

目的和意义
利用分治算法寻找第k小元素并不是适用于所有情况,在处理一些问题时,按照传统的分治的算法似乎并不合理,举个例子,在寻找一万个元素中的第十小元素时利用传统的寻找第k小元素的算法会产生大量的冗余,这时候利用每组的中位数并不合算,找中位数代价极大,然而效益极低,利用组内中位数做标准是针对的普适情况,而处理极端情况是不能让人满意的,如果能调整寻找标准的方法,则能对原本的算法进一步优化。由此做为出发点,产生了本次实验的项目——对寻找第k小元素的算法的优化。

传统分治算法概述与不足
传统分治法中寻找第k小算法可以分为三步,第一步是选点,第二步是根据所选点分组,第三步是判断第k小在哪一组中,并对此组再进行分治处理。本次实验的研究点主要在第一步,传统的选点方法是令每五个数据一组,寻找所有分组内中值的中值,这样的选点方式致使不论寻找第几小,操作的复杂度是没有明显变化的。由于选点趋于中值,所以每次剪枝能力均匀,在处理最大端数据和最小端数据时依旧选择趋于中值的数据进行分组剪枝则不够优秀,会有大量的冗余计算,由此点出发,本文提出了新的选点方式,对算法进行了优化。

分治算法优化思想
分治法寻找第k小元素算法的优化_第1张图片
讨论选点让其拥有较大的剪枝力度是本次研究的关键点,不难发现,如上图所示,对所有元素平均分组,每组中的元素按列排布,各组间按行排布,对每列元素从下到上按递增排列,选定任一行从左到右按递增排列,则对选定行内任一元素,其左下的元素皆小于等于此元素,其右上的元素皆大于等于此元素,而左上的元素、右下的元素与所选数据关系未知。根据此种数据分布关系发现,寻找第k小过程中,若对选定的元素,按上述排列,其左下元素加其本身数目大于等于k个,则说明第k小元素定不在其右上的元素之中。由此出发得出结论,只要保证所选元素左下元素加其本身共k个,则右上的全部元素皆可排除,所以在k3时,此种选点方式的排除能力优于传统选点方式,根据数据排列的对称性,当
k>n- n/23时,可保证右上角元素为n-k个,从而将左下角元素全部排除。

寻找第k小元素分治优化算法实现
约定对所有元素平均分组,每组中的元素按列排布,各组间按行排布,每列元素从下到上为列正方向并且按递增排列,选定的行从左到右为行正方向并且按递增排列。
1.确定选点mm的行和列
①k3,对行号进行遍历,选择行号乘列号大于等于k的最小列号作为待定列号,每个待定列号和对应行号构成一个组合,对每个组合,判断右上的元素最多的一组为mm的行和列
②n/23≤k≤n- n/23,选择每个分组的中值中值为对应点
③k>n- n/2
3,对所有数字取反,并用convert=1记录,令k=n-k+1,而后处理同①。
2.对每一个分组内元素进行排列,而后对选定的行进行排列,根据第一步中选定的行和列提取选定mm的值,此时若convert==1,对所有数据取反。
3.将数据分组A1={x|xm},并判断第k小在哪个组中
4. 对先择的组重复1、2、3、4步直到找到第k小(第k小出现在A2中)或第k小可能存在的数组内数据个数达到事先约定的跳出循环的阈值。
5.若因第k小存在于A2中跳出,返回mm。
6.若达到阈值跳出,对数组内数据进行排序,选择出第k小元素并返回结果。

优化效果分析
图片中实线为传统分治算法,虚线为优化后分治算法,图为操作次数对比
分治法寻找第k小元素算法的优化_第2张图片

你可能感兴趣的:(算法,数据分析)