gpt4 book ai didi

相同算法的 Java 与 C 版本

转载 作者:行者123 更新时间:2023-12-02 05:16:42 25 4
gpt4 key购买 nike

我用 Java 实现了一个程序,令人惊讶的是,该程序为特定测试用例占用了 177M 内存(我没有,因为程序是由一个网站测试的)。

问题是找出字符串 S2 中出现在字符串 S1 中的所有字符。这样的案例有N个。

public static void main(String[] args) throws Exception {
BufferedReader bin = new BufferedReader (new InputStreamReader (System.in));
String jewel, stone;
int t = Integer.parseInt (bin.readLine());
int count;
int i;

while (t-->0) {
count = 0;
jewel = bin.readLine();
stone = bin.readLine();
for (i=0; i<stone.length(); i++) {
if (jewel.indexOf(stone.charAt(i)) !=-1) {
count++;
}
}
System.out.println(count);
}
}

我也不明白,它是如何占用177M的内存的。即使他们正在测试一个巨大的文件,那么那里也只有 2 个字符串。但是代码运行良好并且测试用例通过了。

由于java程序占用了大量内存,所以我计划编写同一程序的C版本。其内容如下:

int main ()
{
char * pch;
char jewel[100], stone[100];
int n;
scanf("%d",&n);
int len;
int tp;
int count = 0;
getchar(); // remove trailing '\n'
while (n-->0) {

gets(jewel);
pch = gets(stone);
count = 0;

while(*pch ) {
if (strchr(jewel, *pch)) {
count++;
}
pch++;
}
printf("%d\n", count);
}
return 0;
}

在少数现有案例中,它正在发挥作用。看来程序也是正确的。但我无法理解为什么它正确地通过了所有测试用例。

所有字符串缓冲区都足够长,可以容纳传入的字符串,这些字符串之间用换行符分隔。

编辑:""+stone.charAt(i)) 更改为 stone.charAt(i)) 没有帮助,并采取了相同的内存量。 还有为什么这个C代码不能通过所有的测试用例

最佳答案

""+stone.charAt(i) 创建一个短暂的字符串对象。这会占用少量内存,最终会被垃圾收集器释放[*]。

另一方面,您的 C 代码根本不分配任何内存。

Java 的垃圾收集器在需要时不一定会工作。如果您的程序有超过 177MB 的可用内存,并且程序通过创建 177MB 的短期对象而产生困惑,那就这样吧。如果您开始耗尽内存,或者垃圾收集器注意到它可能有空闲时间运行,那么它将释放一些内存。因此,您的程序的内存使用量可能会增加以适应可用内存。

或者,即使仍有可用内存,GC 也可能会运行。例如,如果 GC 被迫每 10MB 的分配运行一次,那么您预计此代码的内存使用量约为 10MB,所以我猜在这种情况下并非如此。在另一个 JVM 上也许可以。

[*] Java 实现可以执行理论上的优化,注意没有对对象的引用逃脱循环,然后以不同的方式分配/释放它以避免搅动 GC。我猜这种情况并没有发生,但值得注意的是,不同的 JVM 或具有不同选项的同一 JVM 可能有非常不同的垃圾收集策略。

关于相同算法的 Java 与 C 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10411564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com