Java 将未知数量的对象与未知数量的输入值组合
假设我有一组对象,并且我想要实现的函数接收一个更新值列表来更新我的对象。更新值最多可用于更新一个对象,但也可以是其自身的结果 那么比如说,Java 将未知数量的对象与未知数量的输入值组合,java,algorithm,Java,Algorithm,假设我有一组对象,并且我想要实现的函数接收一个更新值列表来更新我的对象。更新值最多可用于更新一个对象,但也可以是其自身的结果 那么比如说, 我的对象是:[a,b,c] 使用参数[d,e]调用我的更新函数 我想要的是我的对象(a、b、c)与参数值的所有更新组合,其中顺序无关紧要(如中所示,[abce]和[eabc]只需要且应该出现一个)。一些可能的结果: [a;b;c] [ae;bd;c] [ad;b;ce] [strong>a;b;ce;d] [strong>a;b;c;d;e] 最简
- 我的对象是:[a,b,c]
- 使用参数[d,e]调用我的更新函数
- [a;b;c]
- [ae;bd;c]
- [ad;b;ce]
- [strong>a;b;ce;d]
- [strong>a;b;c;d;e]
- [ad]
- [a]
- [丁]
对于任何好奇的人来说,背景是使用多假设跟踪来跟踪多个目标。我的对象是轨迹,更新值是传感器事件。每个传感器事件要么更新单个现有轨迹,生成新轨迹,要么被视为噪声
编辑: 根据Jurgen下面的回答,我实现了如下:
static LinkedList<String> update(List<String> trackLst, List<String> eventLst) {
LinkedList<String> newTracks = new LinkedList<String>();
for ( int e = 0; e < eventLst.size(); e++ )
{
String evt = eventLst.get( e );
for ( int i = 0; i < trackLst.size(); i++ )
{
String trk = trackLst.get( i );
if ( trk == null ) trk = new String("");
trk = trk.concat( evt );
newTracks.add(trk);
}
// No update
newTracks.add( eventLst.get(e) );
}
return newTracks;
}
静态链接列表更新(列表trackLst、列表eventLst){
LinkedList newTracks=新LinkedList();
对于(int e=0;e
在绩效问题上做一点扩展:实际上,在将每个关联纳入最终假设列表之前,我们会以绩效或一致性度量的形式测试其有用性。这仍然是一个很大的数字,但当对象经常重叠且传感器分辨率较低时,需要进行详尽的测试,以便我们可以将关联延迟到以后有更多有意义的数据可用时。这可以使用递归来完成。每个参数都有n+1个选项可供选择。它可以与n个对象中的任何一个相关联,也可以保持自己的状态 因此,如果初始“剩余列表对象”是对象列表[a,b,c,…],剩余参数列表是[d,e,…] 可能的伪代码:
void recur( list<pair> soFar, list remainingObjects, list remainingParam ) {
if ( remainingParam is empty ) {
add remainingObjects to soFar;
print soFar;
return;
}
for parameter in remainingParam: {
for object in remainingObject: {
(remove object and parameter from remaining lists and add pair to soFar)
recur(...);
}
(remove only parameter from remainingParam list and add it to soFar as sole object)
recur(...);
}
}
void recur(列表soFar、列表remainingObjects、列表remainingParam){
如果(remainingParam为空){
将剩余的对象添加到soFar;
印刷字体;
返回;
}
对于remainingParam中的参数:{
对于remainingObject中的对象:{
(从其余列表中删除对象和参数,并将对添加到soFar)
复发(…);
}
(仅从remainingParam列表中删除参数,并将其作为唯一对象添加到soFar)
复发(…);
}
}
可能是这样的吧
List<Tracks> trackLst = ....;
List<SensorEvent> eventLst = ....;
// Make the 2 lists equal in length
while ( trackLst.size() > eventLst.size() ) eventLst.add( null );
while ( eventLst.size() > trackLst.size() ) trackLst.add( null );
for ( int e = 0; e < eventLst.size(); e++ )
{
for ( int i = 0; i < trackLst.size(); i++ )
{
SensorEvent evt = eventLst.get( i );
if ( evt != null )
{
Track trk = trackLst.get( i );
if ( trk == null ) trk = new Track();
trk.update( evt );
}
}
eventLst.add( eventLst.remove(0) );
}
List trackLst=。。。。;
列出eventLst=。。。。;
//使两个列表的长度相等
而(trackLst.size()>eventLst.size())eventLst.add(null);
而(eventLst.size()>trackLst.size())trackLst.add(null);
对于(int e=0;e
当我正确了解您的背景时,您错过了每个输入事件都可能是对任何其他输入事件的更新
此外,我假设每个输入对象都可以是对现有对象的更新。因此,列出所有选项将是一个性能问题。任何算法在找到匹配项时都可能中断
因此,将问题分解为单个输入事件,该事件要么作为更新匹配,要么创建新轨迹。请注意,在这种情况下,根据匹配逻辑,输入顺序确实很重要
要回答您的问题,请执行以下操作:
您有N个轨迹和M个输入。然后每个输入可以属于N+1(噪声)+1(空轨迹)选项。因此,您有(n+2)^m
不同的方法来分配选项的输入
当M和N的顺序为10和1000时,这已经是O(N^M)
假设所有事件都位于同一位置,并且可能都属于一个或多个噪声,那么问题就简化为
O(N*2^M)
“每个输入事件都可能是对任何其他输入事件的更新。”我不这么认为。该函数将使用一次扫描的结果调用,其中包含来自单个时刻的传感器数据。此外,我不能对每个输入单独执行此操作,因为所有输入值的每个组合都形成了一个新的假设。如果是这种情况,如何将它们更新到多个轨迹?它们来自不同位置的传感器吗?在这种情况下,它们不能更新到同一个轨迹,否则它们属于一个轨迹(或是噪声)。每个更新由来自多个传感器的数据组成,这些数据可能重叠。这将创建一组随机的轨迹更新关联。我要寻找的是所有可能的关联。@seb为循环移位添加了外部for