【问题标题】:Adding elements of two big arrays in java在java中添加两个大数组的元素
【发布时间】:2015-09-12 08:46:27
【问题描述】:

我必须想出一个算法来添加两个大数组的元素(每个数组的大小是 10⁹ 的整数,可以达到 10⁹)。 当在 java 中声明两个大小为 10⁹ 的数组时,我得到一个内存异常! 问题陈述:http://bit.ly/1XWbUca

【问题讨论】:

  • 问题是-?你允许你的 JVM 有多少内存?
  • 我使用在线编译器,hackerrank 上的那个
  • 好吧,如果你给我们更多的背景知识,我们可能会告诉你你真的不需要这么大的数组(如果是这样的话)
  • hackerrank: 如果你在做hackerrank.com/challenges/a-very-big-sum,请再次阅读问题说明。在问题本身中提供原始问题陈述的链接(无论如何,这是一种合理的做法)。
  • (1) 输入是如何给出的?您不需要存储至少一个数组,具体取决于输入的方式

标签: java algorithm modular modular-arithmetic


【解决方案1】:

通过分析输入约束,您可以看到,如果您使用两个整数数组来实现解决方案,那么在最坏的情况下您可以获得 2*10^5 * 10^9 次数组访问。所以这种方法行不通。如果你以某种方式解决了你的 MLE 错误,你几乎肯定会得到 TLE。

还有另一种方法...还有另一种选择:)

您只有 200k 操作,这意味着您只需注意 2*200k 点(对于每个操作,您都有开始和结束索引)。 如果您将操作保存在对的排序数组中,其中 ind 是操作的开始或结束索引,值为开始索引的正数和结束索引的负数。

可以通过循环遍历该数组并保留一个 sum 变量来回答查询,为遇到的每个 ind,value 对添加一个值。

虽然这种方法稍微好一点,因为它可以在 O(1) 中向数组的段添加一个值,但在最坏的情况下仍需要 O(n) 进行查询。

所以,我想自定义 segment tree 实现是解决这个问题的方法。

我不太了解,但你可以查一下。

基本上,段树会将所有段存储在树状数据结构中,这意味着元素/段的访问和删除需要 O(log n) 时间......这很好。在这种情况下,段将是特定操作的范围(开始索引,结束索引)。树的每个节点也会保留一个值,您应该添加到该段中。

您将拥有一个用于两个数组的段树。

由于我不知道我在说什么,你可以查看someone谁知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 2017-04-19
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多