我目前正在编写一个用于在 C 中实现滚动中位数滤波器(类似于滚动平均滤波器)的算法。通过查阅文献,似乎有两种比较有效的方法来实现它。第一种方法是对初始值窗口进行排序,然后执行二分搜索以在每次迭代时插入新值并删除现有值。
第二种方法(来自 Hardle 和 Steiger,在 1995 年的 JRSS-C,算法 296 中)构建了一个双端堆结构,其中一个端点是最大堆,另一个端点是最小堆,并且中位数位于中间。这会产生一个线性时间算法,而不是 O(n log n) 的算法。
我的问题在于:虽然第一种方法可行,但我需要在数百万个时间序列上运行此程序,因此效率非常重要。而实现第二种方法却很困难。我在 R 统计软件包的 stats 包中的 Trunmed.c 文件中找到了代码,但它相当难以理解。
有人知道一个良好编写的 C 实现线性时间滚动中位数算法吗?
编辑:Trunmed.c 代码链接http://google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#mYw3h_Lb_e0/R-2.2.0/src/library/stats/src/Trunmed.c