關於實現算法的程式語言問題(C++ or Java)
来源:10-1 总结,算法思想,大家加油
阿寶1118
2021-08-13
老師您好,我是一位大二生,平時學校會有比賽,我身邊很多同學都是使用C/C++再比賽
但我自己是JAVA出生的學生 看到老師有兩門都是關於資料結構與演算法的課程
一門是這一堂課(使用C++) 另一門是使用JAVA
想請問老師,如果在算法方面是一樣的,請問您推薦使用C++還是JAVA當作比賽的語言呢?
因為我自己再打比賽時 往往覺得JAVA的速度遠低於C++
PS:學校JDK是JAVA8 C++標準是17標準的
1回答
-
liuyubobobo
2021-08-14
这个问题,我比较难非常简单地给出一个结论,是因人而异的,同时也因你参加的比赛而异的。
首先,是的, Java 运行会比 C++ 慢,但是很多比赛,对 Java 的运行时间会给出时间的宽限(我上学的时候, ACM 比赛是如此的)。如果没有这个宽限的话,显然 C++ 更吃香。
另一方面,就是看你参加的比赛的类型,是相对更关注算法思想,还是会卡优化卡的很厉害。卡优化的意思是,同复杂度级别的算法,不同的实现,虽然都是正确的,但是实现细节造成的性能不同,就会造成超时和通过的区别。如果你参加的比赛喜欢卡优化的话,也是 C++ 更吃香。
整体我了解很多本科级别的比赛,通常都不会卡优化卡得非常过分,所以使用 Java 应该是没有问题。但是,我个人依然喜欢使用 C++ 打比赛。一方面是少操心了上面所说的性能问题,另一方面就是,我个人认为 C++ 比 Java 灵活得多,很多时候编程更快。
比如不用考虑基本类型和对应的包装类之间的转化问题;比如 C++ 的 string 可以直接当数组用并且是 mutable 的操作更方便,代码更清爽(我们暂不讨论这个设计的好与坏);比如 C++ 可以做运算符重载,对于一些数学类的实现代码更清晰;等等等等。这样的例子非常非常多。(我个人其实不是特别喜欢 Java 语言,只是个人偏好。)
当然,C++ 也有缺点,最大的缺点是存在 undefined behavior,这使得有些时候对于一些 bug 非常难调。但是有经验的同学通常对于算法竞赛中的程序书写,已经不太会遇到这类问题了。(毕竟算法竞赛中用到的 C++ 特性其实是相当有限的);
第二个缺点是没有大数类和高精度浮点类。不过现在通常一般的比赛不会出这种问题(这就是为什么对于计算结果很大的问题,都要求对 1e9+7 求模的原因,保证结果在整型范围里,不需要大数计算)。通常在相对正规的比赛中,不会出现用一种语言很轻松,调用标准库就好,而用另一种语言很麻烦的情况(因为不公平。)
并且,在这个年代,真要考虑标准库的话,其实更好的选择是 Python。
整体,我个人推荐,想要认真玩儿竞赛的同学,应该使用 C++ 和 Python 双语言(Python 是后补语言,在一些特殊情况下有奇效);
但如果你只是对算法竞赛感兴趣,参加算法竞赛的目标是锻炼算法思维和编程能力,而不是向着“运动员”级别的算法竞赛选手的目标前进的话,Java 是没有毛病的。Java 是足够主流的语言,近乎所有平台都支持,并且如果你的目标不是“顶级算法竞赛运动员”,参加的比赛大都不太会卡优化的。还有一点非常重要,Java 的新版本的 JVM 优化越来越好,性能是在提升的。
(但是 Java 8 有点儿老了。现在一般竞赛的 Java 版本是 Java 11。比如 ACM/ICPC。,可以参考这里:https://icpc.global/worldfinals/programming-environment 我的课程虽然是基于 Java 8 的,但主要原因是因为我的课程不完全面向竞赛,很多企业的代码因为历史原因一直在跑 Java 8,但是从竞赛的角度,因为涉及的语法特性并不多,使用 Java 11 是没问题的。因为你们学校都支持 C++ 17 了,Java 不应该这么落后,你可以给学校提提建议。)
最后,我后来的课程主要使用 Java 讲解,是因为慕课网这个平台上大多数同学是面向企业面试的,而在这方面,确实找 Java 工作的同学更多一些。所以我后来的课程都用 Java 了。现在学习我的算法课程,我通常不会推荐这个课程了,而是会推荐这两个课程,都是基于 Java 语言的。不过很多学习这两个课程的同学,会使用其他语言,比如 C++ 和 Python,完整实现课程的代码。
1)一个更加全面的体系课程:https://class.imooc.com/sale/datastructure
2)关于图论相关算法,我专门做了一个课程进行介绍: https://coding.imooc.com/class/370.html
继续加油!:)
00
相似问题