(提前为描述性问题道歉)
我必须将整数作为两个变量的值,并从控制台继续获取整数值。在任何时候,我都可以申请对应于变量输入的整数的总和。例如,对于变量A,我输入了5,5,4,对于变量B,我输入了2,3,6 [这些输入是在不同时间从控制台获取的,而不是同时输入]。在任何时候我都需要显示A的总和(14)和B的总和(11)。
我所想的是声明两个arraylists:A和B各一个。我得到了A&的值。 B,我会继续将它们添加到各自的arraylists。
每当需要显示A的总和时,我会在A的Arraylist索引中添加值并显示。同样的B.
但是,我怀疑这种方法可能效率低下。因为如果我为变量A输入一千个整数,那么arrayList将变为1000个索引长并且会消耗太多内存并且求和将是太多的工作。如果不使用arraylist,我可以实现我想要的吗?其他一些优雅的解决方案?
答案 0 :(得分:1)
听起来你正在尝试做类似的事情: (在Java中)
private int a = 0;
public void add_to_A(int input)
{
a += input;
return;
}
public int a_sum()
{
return a;
}
如上所述,arrayList需要O(n)空间,并且对于输入中的任何给定点,它将在O(n)时间运行。如果您收到病理输入,在每一步要求总和,这将需要O(n ^ 2)时间,这对此问题不利。
正如其他人所指出的,记忆不会成为1000个整数的问题,但为了知识,重要的是要注意,如果我们将输入的大小增加几个数量级并给它一个输入错误(每一步询问A的大小)运行时间会很快爆炸。根据Andreas提交的统计数据,如果阵列算法在几毫秒内运行1000次输入,那么运行一百万次输入的相同算法将更接近几天/周而不幸运行。
答案 1 :(得分:1)
您对列表中的1000个整数以及将它们求和所需的时间有疑问吗?让我消除你所有的疑虑:你没有问题。
试试这段代码:
long start = System.currentTimeMillis();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 1000000; i++)
list.add(i);
int sum = 0;
for (int num : list)
sum += num;
long end = System.currentTimeMillis();
System.out.printf("Sum of %d values is %d%n", list.size(), sum);
System.out.printf("Built and calculated in %.3f seconds%n", (end - start) / 1000.0);
它构建了一个ArrayList<Integer>
,其中一百万值,而不是一个微不足道的1000,然后将它们相加。输出是:
Sum of 1000000 values is 1783293664
Built and calculated in 0.141 seconds
所以,一百万的方式不到一秒钟。 1000?不是问题!