【问题标题】:Why is this code giving time limit exceeded?为什么这个代码给出的时间限制超出了?
【发布时间】:2017-08-08 13:15:17
【问题描述】:

我想挑选出数组中出现奇数次的元素。我从堆中声明了大小为 INT_MAX 的数组并消除了分段错误,但现在它给出了 tle。使用相同的算法可以做什么?

/* C++ code to find out the element that occurs odd number of times, given there is only one such element in the array */

#include <bits/stdc++.h>

using namespace std;

int main(){
    int n, i;
    cin >> n;
    int arr[n];
    for (i = 0; i < n; i++) 
        cin >> arr[i];
    int* a = new int[INT_MAX];  // declared a dynamic array
    fill_n(a, INT_MAX, 0);  //initialised to 0
    for (i = 0; i < n; i++) {
        a[arr[i]]++;    // for every particular value, that corresponding index value increases
    }   

    for (i = 0; i < n; i++) {
        if(a[arr[i]] % 2 == 1) {    //if that corresponding index value is odd, that's the answer
            cout << arr[i];
            break;
        }
    }
        delete[] a;
return 0;       
}

【问题讨论】:

  • 什么是操作系统和编译器?
  • 您需要找到不同的方法。提示:当你将一个数字与自身异或时会发生什么?
  • @Muskan 如果不适合物理内存,则用零填充 8 GB 可能需要很多秒。
  • 如果你知道一个数字恰好出现奇数次,你可以只用两个整数变量来解决这个问题。稍微改变一下你的观点(微妙的提示)。
  • 尝试使用std::map&lt;element, frequency&gt;。如果该元素存在于地图中,则增加频率;否则插入一个新元素。最后,遍历地图,打印具有奇数频率的元素。

标签: c++ time


【解决方案1】:

这个:

int* a = new int[INT_MAX];  // declared a dynamic array

将分配 20 亿个整数,即 8 GB 的存储空间。然后您将随机访问。您的系统可能很难分配这么多存储空间,即使可以,也可能无法在允许的任何时间限制内实际读取和写入这么多内存。

你问

使用相同的算法可以做什么?

什么都没有。这个算法是有缺陷的,不能在实际中使用。您将需要不同的算法。

【讨论】:

  • "...可能无法在任何时间限制内实际读写这么多内存。" 这到底是什么意思?计算机程序不会定期读写超过 8GB 吗?谁规定了时间限制?是编译时还是执行时?
  • @AGNGazer:当人们说他们对简单的测验式程序“超出时间限制”时,这表明他们是在测验平台上执行它们,可能是在线编码测试或类似的。这些测试通常在“小型”机器(可能是虚拟机)上运行。有些程序使用超过 8 GB 的内存,但它们仍然需要相当长的时间(可能一分钟或更长时间)才能用这么多内存做任何有用的事情。现代 CPU 上的原始内存带宽大约为 20 GB/s,但这是假设条件理想的情况; OP 的代码在缓存利用率、TLB 等方面都很糟糕。
  • 感谢您澄清这一点!
猜你喜欢
  • 2022-01-06
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
相关资源
最近更新 更多