Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将未知数量的对象与未知数量的输入值组合_Java_Algorithm - Fatal编程技术网

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)与参数值的所有更新组合,其中顺序无关紧要(如中所示,[abce]和[eabc]只需要且应该出现一个)。一些可能的结果:

  • [abc]
  • [ae;bd;c]
  • [ad;bce]
  • [strong>a;bce;d]
  • [strong>a;bc;d;e]
最简单的例子是两个列表的大小都为1(例如,[a]和[d]):

  • [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