【问题标题】:Can this code be further optimized so that I do not get Time Limit Exceeded or TLE on competitive website?是否可以进一步优化此代码,以便我不会在竞争网站上获得 Time Limit Exceeded 或 TLE?
【发布时间】:2020-08-02 11:44:15
【问题描述】:

The snapshot of the question

在一个竞争激烈的编码网站上,我遇到了这个问题。我能够使用以下代码解决基本用例的问题。但是,大输入超出了时间限制,我尝试减少循环次数,但仍然需要大约 2 秒的时间,但是限制只有 1 秒。

是否还有进一步优化此代码的空间?比如,我们可以删除嵌套循环吗?

static void Main(string[] args)
    {
        string[] first = (Console.ReadLine()).Split(null);          //Sample input -  3 1 2 2 3
        int N = int.Parse(first[0]);
        int X = (int.Parse(first[1]) - 1);
        int Y = (int.Parse(first[2]) - 1);
        int Z = (int.Parse(first[3]) - 1);
        int T = (int.Parse(first[4]) - 1);
        string second = Console.ReadLine();                         // Sample input - 1 2 3
        List<int> list = new List<int>();

        //Converting string inputs to int
        list = second.Split().Select(str => int.Parse(str)).ToList();

        List<int> xorList = new List<int>();
        int xor = 0;
        int temp = 0;
        //Calculate the digits(using bitwise AND) of sub-matrix only, instead of entire matrix, and in the same loop, calculate bitwise XOR also.
        for (int i = X; i <= Z; i++)
        {
            for (int j = Y; j <= T; j++)
            {
                temp = list[i] & list[j];
                xor ^= temp;                    
            }
        }            
        Console.WriteLine(xor);            
    }

编辑:对于大型输入,矩阵的大小可以大到 100000 x 100000。 此外,数字序列可以包含大至 1000000000 的整数。

对于这样的整数,需要 2 秒。

【问题讨论】:

  • 2 秒?对于这个简单的计算(假设样本输入)?你还计算编译时间吗?
  • @JHBonarius 先生,2 秒用于大输入。请参阅编辑。

标签: c# performance optimization bitwise-operators bitwise-xor


【解决方案1】:

首先,让我们假设问题出在布尔值而不是整数上。

那么查看问题的一种方法是,我们感兴趣的子矩阵顶部有一些布尔值,左侧有一些布尔值。那么如果为顶部的布尔值绘制垂直线为真,水平线为侧布尔值绘制为真:

然后任务是计算交叉的数量并确定该数字是偶数(结果:零)还是奇数(结果:一)。

现在更明显的是,它可以在不逐个计算的情况下完成,它可以通过将顶部的 True 布尔值的数量乘以侧面的 True 布尔值的数量来完成。事实上,我们可以对这些数字进行按位与,因为乘积的最低有效位与数字的最低有效位相同。

这只需要线性时间来计算 X..Z 范围和 Y..T 范围内 True 布尔值的数量。

要解决全部问题,请对所有 32 位整数执行此操作。当然,这样做有一条捷径,因为不需要完整的计数(只需要计数的最低有效位),也不需要完整的产品。

也许您更喜欢更代数的解释,那么看到这一点的一种方式是,我们使用 AND 通过 XOR 分布的事实将 a&amp;d ^ a&amp;e ^ a&amp;f ^ b&amp;d ^ b&amp;e ^ b&amp;f ^ c&amp;d ^ c&amp;e ^ c&amp;f(一个 3x3 示例)重写为 (a ^ b ^ c) &amp; (d ^ e ^ f)

一般来说,

horizontal = XOR of list[X .. Z]
vertical = XOR of list[Y .. T]
result = horizontal & vertical

【讨论】:

  • 先生,我明白我正在尝试做的最幼稚的方法,只是按照问题所说的去做。但这种方法只适用于少量输入。为了解决大输入,我们需要算法中的一些智能捷径。我怀疑 Bitwise AND 与 Bitwise OR 结合一定会有一些问题。
  • 是的,它确实有效,但违反了 1 秒的时间限制。您能否为您的方法发布一些伪代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多