我正在尝试理解这段代码的含义 -> http://wiki.tiker.net/MedianFilter
我感兴趣的部分是同时从给定列表中选择最小值和最大值的算法。它(即下面的每个mnmx*
)改变了列表的顺序,使我们得到一个“新”列表,其最小值在最左边,最大值在最右边。让我引用相关部分:
#define s2(a,b) { float tmp = a; a = min(a,b); b = max(tmp,b); }
#define mn3(a,b,c) s2(a,b); s2(a,c);
#define mx3(a,b,c) s2(b,c); s2(a,c);
#define mnmx3(a,b,c) mx3(a,b,c); s2(a,b); // 3 exchanges
#define mnmx4(a,b,c,d) s2(a,b); s2(c,d); s2(a,c); s2(b,d); // 4 exchanges
#define mnmx5(a,b,c,d,e) s2(a,b); s2(c,d); mn3(a,c,e); mx3(b,d,e); // 6 exchanges
#define mnmx6(a,b,c,d,e,f) s2(a,d); s2(b,e); s2(c,f); mn3(a,b,c); mx3(d,e,f); // 7 exchanges
我能看到这个可行,但我真的不知道如何将其概括为给定长度的列表。它是某些众所周知的方法的特殊情况吗?有什么想法吗?
编辑:重新表达问题:每个mnmx*
都由排序对值((a,b),(c,d),...(x,z))的有序列表给出,计算mnmx*
意味着计算s2(a,b)
,s2(c,d)
,...,s2(x,z)
。现在,对于给定的n,如何找到最短的mnmx
,即最短的排序对有序列表,使得按顺序在每个列表上计算s2()
将产生一个新的排序列表,其中最小值位于最左侧,最大值位于最右侧?
float tmp = a
来代替而失去了。有更好的方法可以通过更易读的代码实现同样的事情。 - amitmnmx3
,...,mnmx6
可以实现最小值和最大值的操作,尽管说实话,我只检查了mnmx6
。我正在寻找一种方法来制作给定 k 的mnmxk
。 - tmsmnmx*
函数;明白了。在问题中澄清这一点可能会有所帮助。 - Patrick87</sarcasm>
- Mike Holt