多线程算法逻辑

时间:2015-05-07 22:53:21

标签: java arrays multithreading algorithm

我正在尝试使用多个线程遍历一个非常大的数组,以获得最长的连续出现。我不确定如何分解每个线程的工作。我之前通过将线程数除以线程来计算总数

size/threads

并循环计算出现次数和求和的较小块。

这里的问题是,当阵列分成块时,我的猜测是它会弄乱条纹,或者如果我单独计算它们可能需要很多工作来连接线程。

有人可以提出解决方案吗?我正在用Java编程,但标记了其他语言,因为这是一个逻辑问题,而不是语言特定的

编辑:这是没有并发的代码

public void countStreaks()
{
    for(int i = 0; i < number_of_teams; i++)
    {
        int current_streak = 0;
        highest_streak_per_team[i] = 0;

        for(int j = 0; j < number_of_matches; j++)
        {
            if(home_away_winner[j][0] == i || home_away_winner[j][1] == i)
            {
                if(home_away_winner[j][2] == i)
                {
                    current_streak++;
                }
                else
                {
                    if(highest_streak_per_team[i] < current_streak)
                    {
                        highest_streak_per_team[i] = current_streak;
                    }
                    current_streak = 0;
                }
            }
        }
    }

}

edit2:我更喜欢逻辑解决方案而不是工作/代码解决方案

2 个答案:

答案 0 :(得分:0)

在条纹结束时拆分数组。

如果您计划在i进行拆分,请检查a[i]a[i+1]是否有2个不同的序列。如果它们属于同一个sequanece,请尝试使用i = i+1,直到达到连胜的结束。

答案 1 :(得分:0)

让每个线程产生一个包含六条信息的对象:

  • 范围内的第一个元素开始的条纹的长度和团队
  • 条纹的长度和团队以范围的最后一个元素结束(如果整个范围是一条条纹,则可能与第一个长度相同)
  • 范围内最长条纹的长度和团队(可能与上述任何一项或两项相同)

当所有线程都完成后,迭代所有这些对象(按照与范围顺序对应的顺序)。如果一个范围的结束条纹的团队与下一个范围中的起始条纹的团队相同,则您知道它们可以组合成一个条纹,并且如果起始条纹的长度等于范围长度,则知道它可能与下一个范围内的起始条纹相结合,依此类推。