了解解决此问题的更快方法?

时间:2016-02-11 10:38:57

标签: algorithm optimization

问题陈述在problem给出,如下: -

  

N学生厌倦了计算机课,所以他们看有趣的视频剪辑   在YouTube上。

     

该网站包含K个流行剪辑,编号为1到N.当视频时   观看剪辑,在屏幕上显示类似的视频剪辑列表   侧。

     

每个学生都从主页面中选择一个视频片段并开始播放   看着它。一分钟后,每个学生都对他感到无聊   或者她的视频剪辑,所以他打开了列表中的第一个视频片段   侧面有类似的剪辑(即使他已经看过那个片段)。

     

编写一个程序,为每个学生确定哪个视频片段   将在课程的第M分钟观看。

现在我知道如何解决这个问题,我们找到路径,如果它包含一个循环。我们用它的时期得到答案。

但是我已经在互联网上找到了一种更快的方法,因为它是一个未记录的代码,而且我是一个新手,我无法弄清楚下面的代码中发生了什么。

    int N = in.nextInt (), K = in.nextInt (), M = in.nextInt () - 1;//Reading input

    int log = Integer.numberOfTrailingZeros (Integer.highestOneBit (M)) + 1;

    int [][] next = new int [K][log + 1];

    int [] start = new int [N];
    for (int i = 0; i < N; i++)
        start [i] = in.nextInt () - 1;

    for (int i = 0; i < K; i++)
        next [i][0] = in.nextInt () - 1;

    for (int i = 1; 1 << i <= M; i++)
        for (int j = 0; j < K; j++)
            next [j][i] = next [next [j][i - 1]][i - 1];

    for (int i = 0; 1 << i <= M; i++)
        if (((1 << i) & M) > 0)
            for (int j = 0; j < N; j++)
                start [j] = next [start [j]][i];

    out.print (start [0] + 1);
    for (int i = 1; i < N; i++)
        out.print (" " + (start [i] + 1)); //writing output

我们如何才能有效地解决问题/无需寻找周期? 或者上面的代码如何解决问题?

2 个答案:

答案 0 :(得分:1)

此解决方案通过对矩阵求平方来使用取幂。对于每个视频,相关视频列表是预先确定的,因此您知道哪个视频是此列表中的第一个。因此,对于每个视频,您都知道下一个要观看的视频。

你有一个简单的转换矩阵。在第i行,您将只有一个1 - 位于视频编号i之后的下一个视频的索引处,所有剩余的元素将为0.取此矩阵并将其提升为m-1 - 你会得到一个转换矩阵,如果你开始使用视频i,它会显示你将在第m分钟观看哪个视频。这也解释了为什么解决方案的作者在阅读后从M的输入中减去1。

答案 1 :(得分:0)

上面的代码忽略了cicles。他使用类似于快速取幂的自下而上动态编程方法。他使用下一个矩阵来存储每个学生在1,2,2 ^ 2等步骤之后的下一个位置。这是第3次的工作。然后,在第4个中,他用二进制构造M.这样,如果M = 2 ^ 3 + 2 ^ 0,可以计算每个学生的位置,首先计算2 ^ 0分钟后的位置,将其指定为基准位置,然后计算2 ^ 3分钟后的位置。位置。

如果您查看有关快速取幂的信息,您会发现使用此O(N log(M))存储空间是不必要的,因为只有一个请求可以计算最终位置在进行&#34;快速取幂时#34;步骤

相关问题