为什么我们要在 l10_3、l11_0 和 l12_0 这三个列表中找到一个中间值,而不是所谓的l10_0,l11_0,l12_0呢
时间: 2023-12-11 16:03:01 浏览: 55
非常抱歉,之前的回答有误。在这个算法中,我们需要选择三个子列表来计算中位数,而不是选择三个原始列表。
具体来说,我们将原始列表分为若干个长度为 k 的子列表,然后对每个子列表进行排序。然后我们选择第 i 个子列表的第 j 个元素作为 pivot,将所有列表中小于 pivot 的元素放在一个列表中,将大于 pivot 的元素放在另一个列表中。然后我们统计这两个列表中的元素个数,记为 n1 和 n2,然后根据 n1 和 n2 的大小关系,选择下一步要处理的子列表。
具体来说,我们选择:
- 如果 n1 > 2k 或者 n2 > 2k,那么我们选择小的那个列表中的前 k 个元素,大的那个列表中的后 k 个元素,以及 pivot。
- 如果 n1 + n2 <= 3k,那么我们将所有元素放到一个列表中,然后使用快速选择算法来计算中位数。
在计算过程中,我们需要使用三个子列表,分别为 l10_3、l11_0 和 l12_0。这三个子列表的长度都为 k,可以根据需要进行调整。
相关问题
l01_0 = l11_0 = l21_0 = 127; l02_0 = l12_0 = l22_0 = 127; minmax_0 = l02_0; maxmin_0 = l22_0; for (i = 0; i < cols; i++) { l00_0 = *line0++; l10_0 = *line1++; l20_0 = *line2++; // sort l00_0, l10_0, l20_0 l20_1 = l20_0; l10_1 = l10_0; if (l20_0 > l10_0) { l10_1 = l20_0; l20_1 = l10_0; } // swap l00_1 = l00_0; l10_2 = l10_1; if (l10_1 > l00_0) { l00_1 = l10_1; l10_2 = l00_0; } // swap l20_2 = l20_1; l10_3 = l10_2; if (l20_1 > l10_2) { l10_3 = l20_1; l20_2 = l10_2; } // swap if (l01_0 < minmax_0) minmax_0 = l01_0; /* Compute min of max */ if (l00_1 < minmax_0) minmax_0 = l00_1; if (l21_0 > maxmin_0) maxmin_0 = l21_0; /* Comput max of min */ if (l20_2 > maxmin_0) maxmin_0 = l20_2; // sort l10 l11 l12 t0_1 = l10_3; /* Compute median of median */ t1_1 = l11_0; if (l10_3 > l11_0) { t0_1 = l11_0; t1_1 = l10_3; } t1_2 = t1_1; if (t1_1 > l12_0) { t1_2 = l12_0; } medmed_0 = t1_2; if (t0_1 > t1_2) { medmed_0 = t0_1; } // swap // minmax, medmed, maxmin medmed_1 = medmed_0; minmax_1 = minmax_0; if (minmax_0 > medmed_0) { medmed_1 = minmax_0; minmax_1 = medmed_0; } medmed_2 = medmed_1; if (medmed_1 > maxmin_0) { medmed_2 = maxmin_0; } medmed_3 = medmed_2; if (minmax_1 > medmed_2) { medmed_3 = minmax_1; } /* Move data along by one column */ minmax_0 = l01_0; l12_0 = l11_0; maxmin_0 = l21_0; l01_0 = l00_1; l11_0 = l10_3; l21_0 = l20_2; *out_data++ = medmed_3; } }
这段代码是用于图像处理中的中值滤波器,它的作用是去除噪声并平滑图像。在这段代码中,它对图像的每一列进行处理,首先将当前像素点的上下三个像素点按大小排序,然后取中间值作为当前像素点的值。接着,根据当前像素点左侧的像素点和右侧的像素点的大小关系,计算出当前像素点的值与其左侧像素点和右侧像素点的最大值和最小值,最后将处理后的像素点值存储到输出数据中。
然后用快速选择算法计算排序后的中值,具体来说,先将 l10_3 和 l11_0 按升序排序,然后将排序后的结果与 l12_0 按升序排序,最后得到中间值 medmed_0。这一步是为什么呢
这一步是为了在 l10_3、l11_0 和 l12_0 这三个列表中找到一个中间值。快速选择算法是一种用于从未排序的列表中查找第 k 小元素的算法,它的时间复杂度为 O(n)。在这里,我们需要找到三个列表中的中间值,因此我们需要使用快速选择算法分别在 l10_3 和 l11_0、l12_0 中找到中间值,然后再将这两个中间值合并,得到最终的中间值 medmed_0。
阅读全文