【发布时间】:2014-05-16 11:18:06
【问题描述】:
虽然我已经阅读了有趣的线程Algorithm: efficient way to remove duplicate integers from an array,但我还没有找到满意的答案:
我有一个 doubles 的一维数组,它通常很小(最多只包含三个元素) - 尽管为了通用性,这不需要成为标准。
此外,我不想只找到真正的重复项,而是从某种意义上说元素的差异低于某个阈值的重复项。虽然这个要求很容易处理,但我的实际问题是:如何以尽可能少的开销在 ANSI C 中实现一般的重复删除?
备注:我无法从上述线程中找到解决方案的主要原因有三个:
- 许多给定的解决方案使用纯 C 以外的语言,因此这没有任何特别的帮助。
- 如果数组中的所有元素都相等,则某些解决方案将无法正常工作,我的情况可能就是这种情况。
- 某些描述的算法似乎仅适用于整数值。作为一个 C 菜鸟,任何建议都非常感谢。
附录: 在某种伪代码中,我想要实现的是:
1) Sort the array in ascending manner
2) Loop through array until element before the last one
- Check if difference of element i to element i+1 is smaller than threshold
-> If yes, store mean value as first element of new array
-> If no, store original value of element i as first element of new array
3) Start the same again in order to check if now the differences between the new array elements lie below the threshold
-> Abort if no difference is smaller than the threshold anymore
因此,我的主要问题是:如何实现第 3 步,以便可以进行任意次数的迭代,并且只要存在“太接近”的数组元素(相对于我的阈值),函数就会运行。
【问题讨论】:
-
我会警告你,阈值条件使这成为一个难题。例如,如果您的阈值为 0.25,并且您有三个值 1.0、1.2 和 1.4,则有 多个 个可能的“正确”答案(消除 1.2,因为它在 1.0 的阈值内,消除 1.4出于同样的原因,关于 1.2 甚至可能不再存在,请消除 both 等)。
-
如果数组保证很小,一个简单的二环(二次)独奏就足够了。如果你想强制相邻的值:排序+分成强制块+用平均值替换每个块
-
@joop 这就是我想做的事情。但是:如何将数组划分为可强制执行的块?这几天我一直在思考这个问题,但我离解决方案还差得远。我什至不再关心效率了......
-
@WhozCraig 我理解并在原始问题的附录中添加了我对如何解决此问题的想法。不幸的是,我仍然缺乏为该算法找到可行的 C 解决方案的技能。
-
0) 是否允许对数组进行排序,还是应该保持原始顺序?如果允许对数组进行排序/更改:1) 排序 2) 查找块边界 3) 聚合块。 (第 2 步和第 3 步可以结合使用)如果不允许排序,您最终可能会得到某种树,例如区间/范围树。
标签: c arrays algorithm duplicate-removal