【问题标题】:Faster method to input integer into array than scanf() or cin?比 scanf() 或 cin 更快地将整数输入数组的方法?
【发布时间】:2019-07-19 12:32:24
【问题描述】:

实际上,我遇到了一个竞争性问题,我需要输入一个大数组,但我收到 TLE 错误,所以除了传统方法之外还有其他方法可以减少 TLE。

我已经尝试了一些技巧,但它不起作用。

#include<bits/stdc++.h> //rather than other files
ios_base :: sync_with_stdio(false);
cin.tie(NULL)

时间减少了,但没有那么多。

那么除了这些还有其他方法可以减少输入整数到数组的输入时间吗?

【问题讨论】:

  • 为了更快,您可以使用 read() 将输入数据从文件/标准输入大块地带到内存中,然后解析每个块。这比访问文件/标准输入的次数要多得多,每次读取的字符数要少得多。
  • 您有两个主要问题:输入速度和转换速度。输入速度是你获取数据的速度。转换速度是将整数从文本表示转换为内部表示。如果您想要快速输入,请参阅istream::read() 方法。瓶颈是等待换行;否则您可以执行块或批量读取。
  • 在线评委(或比赛)的大多数表现问题是算法。超时是由于选择了慢速算法。大多数问题或问题很少涉及优化技术(例如循环展开)。

标签: c++ c++11 integer


【解决方案1】:

scanf() 的输入速度比 cin 快。仅当您无法使用 scanf() 和 printf() 时,才建议使用 sync_with_stdio(false)cin.tie(NULL) 行。

对于输入整数的更快方法,您可以尝试以下来源:https://www.hackerearth.com/practice/notes/fast-io-optimization-in-c/

【讨论】:

  • 出于兴趣,您提供的链接使用了 register 关键字,该关键字在 C++17 中已被弃用 - 是否应该用某种东西替换关键字,或者如果他与C ++ 17 以某种方式自动优化?
【解决方案2】:

您应该增加输入缓冲区。这将大大提高您处理大数据的性能:

constexpr size_t BufferSize = 65536;
char buffer[BufferSize ];
std::ifstream file{};
file.rdbuf()->pubsetbuf(buffer, BufferSize );

使用大缓冲区的 fread 也会更快。 请尝试。

【讨论】:

  • 你能分享一下这个例子吗,或者我在将数据输入数组时如何使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2018-09-18
  • 2015-03-13
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
相关资源
最近更新 更多