【问题标题】:Algorithm for data alignment of float arrays in JavaJava中浮点数组的数据对齐算法
【发布时间】:2010-11-08 22:28:22
【问题描述】:
我在折线图中有两个表示 y 值的浮点数组。现在我想对齐这两个图表。有没有现有的两个数组对齐的算法?
一个非常简单的例子
a:
2.5 1.3 1.6 4.2 3.6
b:
3.3 1.4 2.5 1.3 1.6
现在对齐后应该是:
2.5 1.3 1.6 4.2 3.6
3.3 1.4 2.5 1.3 1.6
实际上它要复杂得多,每个数组的大小约为 30 000 并且浮动类似于 -6.94709206
【问题讨论】:
标签:
java
algorithm
alignment
【解决方案1】:
原则上,这很容易:
for (an=0;an<a.length;++an)
{
for (bn=0;bn<b.length;++bn)
{
if (a[an]==b[bn])
{
boolean run=true;
for (offset=1;offset<a.length-an && offset<b.length-bn;++offset)
{
if (a[an+offset]!=b[bn+offset])
{
run=false;
break;
}
}
if (run)
... match at a[an], etc matching b[bn], etc
}
}
}
... no match ...
使用浮点数时,如果数据中存在任何不精确的可能性,您可能会遇到一个问题,即它们可能不必完全相等才能被视为匹配项。而不是 a[an]==b[bn] 你可能想说 abs(a[an]-b[bn])免责声明:代码不在我的脑海中并且未经测试。没有任何明示或暗示的保证。你的旅费可能会改变。禁止的地方无效。如果出现皮疹,请咨询您的医生。
【解决方案2】:
这基本上是正常的模式匹配,你应该可以使用大多数适合字符匹配的简单算法。
简单搜索的最坏情况通常是 n*m(假设 n 和 m 是浮点序列的长度),也许您可以使用类似于 Boyer-Moore 的算法减少运行时间,如果其中一个是线性的序列保持不变。
【解决方案3】:
假设两个数组在某个部分匹配。
- 使用二分法查找
a在b中的第一个元素的位置
- 如果不存在这样的位置,则在
a 中查找b 的第一个元素的位置
- 如果仍然没有匹配,则将
a 放在b 后面,如果first a > last b -- b 在a 后面,否则