减少代码的时间复杂度

时间:2015-09-02 08:26:34

标签: c# console-application time-complexity

我有以下代码,但处理BigInteger类型的52957输入需要20秒。这是我要解决的问题https://www.hackerearth.com/problem/algorithm/girlfriends-demands/

Create<TAggregateRoot>

请指定如何减少代码的时间复杂度。此程序获取字符串中指定位置的字母,如果它们相同则打印为true,否则为false。在循环之前计算范围也没有帮助

4 个答案:

答案 0 :(得分:4)

为什么使用BigInteger? 在任何情况下,string.length都是int的类型。 这意味着如果你的字符串超过2147483647 (2^31 -1),你的程序就会被破坏。

我认为将BigInteger更改为int会有所帮助。

答案 1 :(得分:3)

Console.ReadLine().Split()

是您遇到的最大问题。对于文件中的每一行,您将创建一个字符串数组,每个字符串一个字母。这是一个巨大的性能消耗,几乎肯定不是你想要的 - 特别是,使用BigInteger来存储一位数的数字是不必要的......

我假设您实际上想要根据某些分隔符将行拆分为两行。例如,如果您的数字用逗号分隔,则可以使用

Console.ReadLine().Split(',')

即便如此,根本没有理由使用BigInteger。您尝试执行的操作明显是基于字符串的,并且很容易使用字符串。但是,我不能更具体地帮助你,因为你的问题描述对于这么简单的任务来说是非常模糊的,并且代码显然是错误的,猜测对于你究竟是什么来说完全没用试图做。

修改

好的,你的链接证实了我的假设 - 你大量过于复杂。例如,像这样的代码将执行:

var word = Console.ReadLine();
var items = int.Parse(Console.ReadLine());

for (var _ = 0; _ < items; _++)
{
    var indices = 
          Console.ReadLine()
           .Split(' ')
           .Select(i => (int)((long.Parse(i) - 1) % word.Length))
               .ToArray();

    Console.WriteLine(word[indices[0]] == word[indices[1]] ? "Yes" : "No");
}

首先请注意,这些数字始终适合long,这样可以避免使用BigIntever。其次,您需要正确使用Split - 在这种情况下,分隔符是一个空格。第三,没有理由不在单个流中进行整个处理 - 等待整个输入,将其收集到内存中然后立即输出所有内容是浪费内存。第四,注意在简单的算术运算中结合整个必要的机制时,避免大多数复杂检查是多么容易。

每个输入数据运行不到2秒,仅使用~80kiB的内存。

我认为从意识形态来说,这非常适合网站 - 它非常简单明了,适用于所有预期的输入 - 完美的黑客。当然,如果这是针对最终用户应用程序的话,你需要额外的检查,但HackerEarth站点名称暗示黑客是真正的预期。

答案 2 :(得分:1)

根据我的经验,频繁的Console.WriteLine通话会导致大量的执行时间。

我想你应该使用StringBuilder对象,并将所有输出附加到它上,而不是在想要添加某些输出时调用该函数。然后,在for - 循环之后,请致电Console.WriteLine一次以打印StringBuilder的内容。

这可能不是你的程序最大的问题,但它会有所帮助。

答案 3 :(得分:0)

Myabe通过删除这些行中的强制转换并使用string.compare你可以减少执行时间

            if(string.Compare(startf.ToString(), endf.ToString()))
            {
                Console.WriteLine("Yes");
                continue;
             }
                Console.WriteLine("No");