我有以下代码,但处理BigInteger类型的52957输入需要20秒。这是我要解决的问题https://www.hackerearth.com/problem/algorithm/girlfriends-demands/
Create<TAggregateRoot>
请指定如何减少代码的时间复杂度。此程序获取字符串中指定位置的字母,如果它们相同则打印为true,否则为false。在循环之前计算范围也没有帮助
答案 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");