Algorithm 如何为竞争性编程处理非常大的输入阵列?

Algorithm 如何为竞争性编程处理非常大的输入阵列?,algorithm,Algorithm,我正试图解决一个程序问题,参考0-1背包问题,我被困在尺寸限制,因为对于大输入,袋子的容量为10^9 因此,在C/C++中编写类似int-arr[no_of_items][1000000001]的代码总是会导致分段错误 我已经尝试过用其他语言(如python)编写代码,但对于如此大的数组,它也会遇到困难。我不知道如何进一步进行,也不知道是否有任何可能的方法 请帮助我获得正确的方法或重定向到一些可能对我有帮助的链接,以及是否有任何博客或网站,其中与竞争性编程相关的查询由其他程序员审查 [编辑]:根

我正试图解决一个程序问题,参考0-1背包问题,我被困在尺寸限制,因为对于大输入,袋子的容量为10^9

因此,在C/C++中编写类似int-arr[no_of_items][1000000001]的代码总是会导致分段错误

我已经尝试过用其他语言(如python)编写代码,但对于如此大的数组,它也会遇到困难。我不知道如何进一步进行,也不知道是否有任何可能的方法

请帮助我获得正确的方法或重定向到一些可能对我有帮助的链接,以及是否有任何博客或网站,其中与竞争性编程相关的查询由其他程序员审查

[编辑]:根据其他人的建议添加问题

There is a king with total land of M unit area. He has N chidren and each of them wishes some unit area of his land. Being a father, he cannot deny his children but he either fulfill the wish of his/her child or doesn't give him anything.

Given the total unit area of his land and demands by each child, the problem is to find out which of his children should he choose to give his property so that maximum of his land will be distributed.

Sample input:

15 3
5 8 9

Sample ouput:
0 2

Explaination:

first line is size of total kingdom and number of children he has 
second line contains demand by each child.

Here, he can give away land in following manners:

{} : Gives nothing
{5} : Gives 5  unit area
{8} : Gives 8  unit area
{9} : Gives 9  unit area
{5,8} : Gives 13  unit area
{5,9} : Gives 14  unit area
{8,9} : Gives 17  unit area (Not possible)
{5,8,9} : Gives 22  unit area (Not possible)

Since, out of all possible combinations choosing {5,9} will result in maximum land distribution hence, the king will give his property to 0th and 2nd child.

Constraints:

Maximum land size : 10^9
Maximum no. of child : 10^5
Maximum demand by each child : 1<= demand <=maximum_land_size

Note: The demand by each sucessive children will be greater than previous one.
有一个国王,他的土地总面积为M单位面积。他有N个孩子,每个孩子都希望自己的土地有一个单位面积。作为一个父亲,他不能拒绝他的孩子,但他要么满足了他/她的孩子的愿望,要么什么都不给他。
考虑到他的土地的总单位面积和每个孩子的需求,问题是要找出他应该选择哪一个孩子来给他的财产,以便最大限度地分配他的土地。
样本输入:
15 3
5 8 9
样本输出:
0 2
解释:
第一行是整个王国的大小和他有多少孩子
第二行包含每个孩子的需求。
在这里,他可以通过以下方式赠送土地:
{}:什么也不给
{5} :给出5个单位面积
{8} :给出8个单位面积
{9} :给出9个单位面积
{5,8}:给出了13个单位面积
{5,9}:给出14个单位面积
{8,9}:给出17个单位面积(不可能)
{5,8,9}:给出22个单位面积(不可能)
因为,在所有可能的组合中,选择{5,9}将导致最大的土地分配,因此,国王将把他的财产给第0个和第2个孩子。
限制条件:
最大土地面积:10^9
最大子项数:10^5

每个孩子的最大需求:1很难准确地说明您的具体情况,但一般来说,这里的策略将包括以下内容:

  • 一次只将阵列的一部分加载到内存中,其余部分放在磁盘上

  • 有一个函数可以生成索引0处的元素,很难准确地针对您的具体情况,但一般来说,这里的策略将包括以下内容:

  • 一次只将阵列的一部分加载到内存中,其余部分放在磁盘上

  • 如果你的意思是 你应该以一种使用更少内存的方式重写它


    具体来说,您可以看到,对于
    i
    的任何值,您只关心
    K[i][…]
    K[i-1][…]
    ;因此,无需记住所有其他值,即,您需要
    2*W
    元素而不是
    n*W
    元素。

    如果您的意思是 你应该以一种使用更少内存的方式重写它


    具体来说,您可以看到,对于
    i
    的任何值,您只关心
    K[i][…]
    K[i-1][…]
    ;因此,不需要记住所有其他值,即代替<代码> N*W元素,您需要代码> 2 *W元素。

    < Python中,可以使用字典或C++中使用unOrdEdEdMaX()。 在Python中,可以使用字典,并将键作为元组。因此,您可以将其检查为DP[(i,w)],而不是将以前的值检查为DP[i][w]

    示例代码

    from collections import defaultdict
    
    dp = defaultdict(lambda : -1)
    
    #access it as dp[(i,w)],  if (i,w) is not a key then it will return -1 
    
    

    在Python中访问键

    的值具有恒定的平均时间复杂度,可以使用字典或C++,可以使用unOrdEdEx MaP()。 在Python中,可以使用字典,并将键作为元组。因此,您可以将其检查为DP[(i,w)],而不是将以前的值检查为DP[i][w]

    示例代码

    from collections import defaultdict
    
    dp = defaultdict(lambda : -1)
    
    #access it as dp[(i,w)],  if (i,w) is not a key then it will return -1 
    
    

    它具有恒定的平均时间复杂度,用于访问密钥的值

    您需要包括您正在使用的操作系统和版本。请分享问题以及您迄今为止的尝试。@GuyCoder OS:ubuntu 18.04 LTS,C++版本:7.4。0@unlut:问题是简单的0-1背包问题,其中物品的数量可以是10^5,袋子的容量可以是10^9。我尝试使用普通的DP方法将所有子结果存储在二维数组中。我猜这个练习的目标是实现一个不需要如此大内存的算法。你需要包括你正在使用的操作系统和版本。请分享这个问题以及你迄今为止所做的尝试。@GuyCoder OS:Ubuntu18.04 LTS,C++版本:7.4。0@unlut:问题是简单的0-1背包问题,其中物品的数量可以是10^5,袋子的容量可以是10^9。我试着使用普通的DP方法将所有子结果存储在二维数组中。我想这个练习的目标是实现一个不需要这么大内存的算法。你所说的解决方案很好,但我的实际问题是我无法定义一个大小为W,即10^9的数组。2*10^9还有很长的路要走。你说的解决方案很好,但我的实际问题是我无法定义大小为W的数组,即10^9。2*10^9还有很长的路要走。谢谢你的建议,我会试试这个,但这个能满足我的空间问题。谢谢你的建议,我会试试这个,但这个能满足我的空间问题。