【问题标题】:java minimal memory usage for output用于输出的 java 最小内存使用量
【发布时间】:2013-01-04 09:11:55
【问题描述】:

我正在尝试解决问题,但遇到内存限制 我认为这是输出前缓冲的原因 我有整数,如何以最少的内存使用输出它们? 现在我正在使用 PrintWriter。还有其他更好的方法吗?

import java.io.*;
import java.util.*;

class stack_ {
public char index;
public int value;

public stack_(char ind, int val) {
    index = ind;
    value = val;
}
}

public class timous {
public static void main(String[] args) throws IOException {
    StreamTokenizer in = new StreamTokenizer( new BufferedReader (new InputStreamReader(System.in)) );
    Vector<stack_> numbers = new Vector<stack_>();
    PrintWriter out = new PrintWriter(System.out);

    in.nextToken();
    char num = (char)in.nval;
    for (char i = 0, k; i<num; i++) {
        in.nextToken();
        if (in.sval.equals("POP")) {
            k = (char)(numbers.size()-1);
            in.nextToken();
            while (numbers.elementAt(k).index!=(char) in.nval)
                k--;
            out.println(numbers.elementAt(k).value);
            numbers.removeElementAt(k);
        }               
        else {
            in.nextToken();
            k = (char)in.nval;
            in.nextToken();
            numbers.add(new stack_(k, (int) in.nval));
        }
    }
    out.flush();
}
}

内存限制测试3;时间 0.078;内存 834 KB

import java.io.*;
import java.util.*;

public class timous {
    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer( new BufferedReader (new InputStreamReader(System.in)) );
        int[] numbers_int = new int[20000];
        char[] numbers_char = new char[20000];
        PrintWriter out = new PrintWriter(System.out,true);

        in.nextToken();
        char num = (char)in.nval;
        for (char i = 0, k, cur=0; i<num; i++) {
            in.nextToken();
            if (in.sval.charAt(1)=='O') {
                k = cur;
                k--;
                in.nextToken();
                while (numbers_char[k]!=(char) in.nval)
                    k--;
                out.println(numbers_int[k]);
                for (; k<19999; k++){
                    numbers_int[k] = numbers_int[k+1];
                    numbers_char[k] = numbers_char[k+1];
                }
                cur--;
            }               
            else {
                in.nextToken();
                numbers_char[cur] = (char)in.nval;
                in.nextToken();
                numbers_int[cur] = (int)in.nval;
                cur++;
            }
        }

    }
}

【问题讨论】:

  • 你的问题是什么?代码有什么作用?你能提供更多的背景信息吗?如果您需要低内存占用,则说明您选择了错误的语言。
  • 阅读标题后,很明显您选择了错误的语言Memory Limit: 0.75 MB。您需要在不使用虚拟机运行的情况下构建它。
  • 关注这个解决方案! accepted solutions

标签: java output


【解决方案1】:

创建缓冲区时,缓冲区的大小是固定的。这意味着无论您如何使用它或填充它,它都不会使用更多内存。默认为 8 KB,这不太可能是您内存不足的原因。

它更有可能是堆栈对象的向量(集合的奇怪选择),尽管您必须创建数百万个这样的向量才能导致问题

顺便说一句,如果没有至少 1.1 MB 的堆(对于这种大小,这是程序的一小部分),Java 7 将无法启动。也就是说,您甚至无法打印它的版本。

$ java -mx1000k -version
Error occurred during initialization of VM
Too small initial heap for new size specified

$ java -mx1100k -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b11)
Java HotSpot(TM) Client VM (build 23.3-b01, mixed mode, sharing)

如果您想知道为什么 Java“需要这么多内存”,我想说这些天对于大多数运行 Java 的系统来说都没什么。您可以花 200 美元购买 32 GB,因此 1 MB 仅值 0.6 美分并且可以重复使用。


鉴于它确实与问题相关,您可以使用这些方法解析和输出 int 值。

static int readInt() throws IOException {
    int num = 0, ch;
    while ((ch = System.in.read()) > 0)
        if (ch > ' ')
            break;
    if (ch < 0)
        return -1;
    do {
        num = num * 10 + ch - '0';
        ch = System.in.read();
    } while (ch > ' ');
    return num;
}

static void writeInt(int i) {
    if (i == 0) {
        System.out.write('0');
        System.out.write('\n');
        return;
    } else if (i < 0) {
        System.out.write('-');
        writeInt(-i);
        return;
    }
    int tens = 1000000000;
    for (; tens > i; tens /= 10) ;
    for (; tens > 0; tens /= 10)
        System.out.write((char) ('0' + i / tens % 10));
    System.out.write('\n');
}

public static void main(String... args) throws IOException {
    int count = readInt();
    for (int i = 0; i < count; i++) {
        int pushPop = readInt();
        switch (pushPop) {
            case -1: // OEF
                return;
            case 36074: // PUSH
            case 71626: // push
                push(readInt(), readInt());
                break;

            case 3542: // PUSH
            case 7094: // pop
                writeInt(pop(readInt()));
                break;
        }
    }
}

【讨论】:

  • 我知道java和他的内存使用有很多问题但是这个问题用java解决了!这意味着有解决方案! examples of accepted timing and memory
  • 我不认为这是一个问题。内存使用量相当可疑,恕我直言,因为你真的只需要欺骗 Java 说它使用更少的内存,因为总数永远不会那么低。
  • 以及为什么我认为这个问题与输出有关,如果我没记错的话。print 为整数调用 toString 函数,然后打印它,我相信它为此使用了内存!
  • 我已经尝试了一些事情,我可以告诉你 a) 你不能创建任何垃圾或使用内置函数来解析或输出数字。 b)您需要使用必须回收的int[] 块分配堆栈。 32-64 的数组似乎是最好的。即使这样,我在第三次测试中也超出了内存使用量。注意:Hello world 说它使用 326 KB。如果你只是 GC,它说你使用了 4885 KB:P
  • 我正在考虑这个解决方案的时间限制问题,因为每个令牌都是单独读取的,我认为有很多调用很耗时。像扫描仪和bufferedReader。而且也没有必要检查'-',因为所有数字都是> = 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多