当前位置:   AI > 正文

为什么编程竞赛参赛者使用C++和Java?

language-agnostic,go,python,程序员,算法,c#,vb,安全,lua,ruby,人工智能,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站长工具

在参加今年的Google Code Jam 竞赛之后,我不禁注意到使用C/C++和Java的[成功]参赛者人数众多.在这里可以看到整个比赛中使用的语言分布.

在用C/C++编程好几年后,我最近因其可读/直接的性质而爱上了Python.最近,我学习了OCaml,Scheme等功能语言,甚至像Prolog这样的逻辑语言.这些语言当然有它们的优点,在我看来,在某些情况下,它可以比C++和Java更容易应用.例如,Scheme使用call/cc简化了回溯(回答几个问题所需的工具)和Prolog的逻辑规范,虽然由于其强力性质而效率低下,但可以极大地简化(甚至自动解决)某些难以解决的问题.包裹一个人的大脑.

很明显,竞赛选手应该使用最适合挑战的工具.即使是x86程序集也是图灵完成的 - 这并不能证明解决它的问题.在这种情况下,为什么使用不太常用的语言(如Scheme/Lisp,Prolog,甚至Python)的参赛者比使用C/C++和Java的参赛者要少得多?换句话说,为什么没有成功的参赛者使用的语言虽然可能不那么主流,但可以说是更好的工具?

我的问题有几个动机.最重要的是,我希望成为一名更好的程序员 - 无论是在实践方面还是在竞争方面.在介绍了诸如功能和逻辑编程之类的美妙范例之后,看到有这么多人抛弃它们而转向支持C/C++和Java是令人沮丧的.它甚至让我怀疑我对这些范例的钦佩,担心我不能在编程竞赛中成为Lisp/Scheme/Prolog程序员.



1> ShreevatsaR..:

好问题!作为一个自己涉及编程竞赛的人,我可能有话要说.

[让我们得到标准的免责声明:比赛编程只与"现实世界中的编程"松散相关,同时它测试算法和解决问题的技巧以及能够提供快速无错工作代码的能力时间压力,它不一定与能够构建大型软件项目,编写可维护代码等相关(超出了结构良好的程序更容易调试的事实).

现在回答一些问题:

C++/Java在现实世界中比其他语言更常见,因此您可以期望在任何地方看到更高的比例.(但在竞赛人群中甚至更高.)

这些参与者中有许多是学生,或者作为学生参加竞赛,而C++/Java是学生学习的更常见的"第一语言".(这些天的本科生可以从Scheme,Haskell,Python等开始,但是高中生(通常是自学成才的)不那么经常.)事实上,许多东欧参与者仍然使用Pascal,并且更加惊人比我们其他人都会用任何语言.

学校和大学级别的比赛通常使用这些语言.国际信息学奥林匹克(IOI)只允许使用C,C++和Pascal(或者它现在允许使用Java;我没有跟上),而ACM校际编程竞赛(ACM ICPC)只允许使用C,C++和Java.TopCoder允许C++,Java,C#和VB(真的:p); 最近,Python.所以你可以说"竞赛生态系统"中有更多的C++/Java程序员.实际上,Google Code Jam和IPSC是少数允许使用任何语言编写代码的竞赛之一.

现在的问题是,在GCJ,参赛者可以自由选择一种语言,他们为什么不选择Python或Scheme?最相关的因素是这些语言很.当然,对于大多数真实世界的编程来说,它们很容易就足够快,但是对于所有测试用例在n秒限制下运行程序通常涉及的紧密循环,这些语言不会削减任何算法上涉及更多的问题.(设计用于接受O(n log n)解决方案而不是用于C/C++的Θ(n 2)解决方案的问题经常排除在较慢语言中的最佳O(n log n)解决方案.甚至Java曾经被赋予了障碍USACO;我不确定是否仍然如此.)

另一个因素是库:C++和Java有更好的库用于经常使用的算法和数据结构(例如红黑树,C++的next_permutation),而Python的库(对于现实世界来说足够好)在这里不太有用,Prolog和Scheme ......我不知道他们的图书馆.这是一个相对较小的因素,因为这些程序员可以在必要时编写自己的代码.:-)

通用的多范式语言对于在比赛的时间限制内完成任务比使用强制理念或对你做事的方式的语言更有用.这就是为什么Prolog将永远不受欢迎的原因.(一般哲学:有些语言是"启用"语言,可以让你做任何事情,包括用脚射击自己,有些是"指挥",迫使你以正确的方式做事.)这也是为什么C++比三倍更受欢迎的原因. Java在一般比赛参赛者中,并且在顶级选手中更受欢迎.由于代码不必被其他任何人读取,因此可以使用循环宏,甚至是有用的FOR(i,n)(输入的代码越少,更重要的是在匆忙时制造错误的机会越少).没有什么可以反对Java,也有一些顶级程序员也使用Java.:-)

最后,虽然许多顶级程序员可能将C++/Java/Pascal作为他们的"第一语言",但由于他们的语言不好,所以你不必对此感到绝望.这些相同的程序员中的许多人都赢得了像ICFP竞赛这样的竞赛,即使故意使用疯狂的语言,如shell脚本,m4(用于autoconf)和汇编(团队名为"你不能在没有ASM的情况下拼写真棒").


我想补充一点关于速度的部分.像GCJ这样的竞赛中的"速度"是代码的运行时复杂性(即big-O).在GCJ中,通常即使在慢速语言中也能接受正确的算法(因此有许多可接受的Python提交),而慢速算法甚至会在asm中永久使用.有一些例外,但通常如果您使用正确的算法/技术,即使使用较慢的语言也是安全的.
我同意; 正如我所说,图书馆的存在是一个相对非常小的问题.如果你认为我夸大它,我可以删除它.
在第二个到最后一个要点中关于Java的那一点并不完全正确.GCJ的许多顶级参赛者都使用Java.

2> Tatiana Rach..:

我喜欢Jerry Coffin关于策划Google AI竞赛参赛者的想法,因此我将所有结果绘制出来并绘制它们(计算平均值,标准偏差,然后绘制Excel中的正态分布曲线).

有了Lua和JS,得到了这个:

没有(参赛者很少,所以结果可能会有所偏差):

看起来Java参与者的确比其他参与者差得多,而Go,Common Lisp和C则更好.



3> Nikita Rybak..:

为什么我们都说英语而不是世界语?嗯,它刚刚发生了.即使英语不一致和臃肿,世界语也被故意设计为"更好的工具".

因此,一个原因是传统.在大多数学校,编程仍然用C/C++,Java,Pascal甚至Basic编写.参加那些比赛的大多数学生,选择他们更熟悉的语言.
此外,您可以注意到大多数算法书籍都采用Pascal或Ada风格的psedudocode,而且很少 - Lisp.我不知道为什么,也许也是一种传统.或者它可能对算法不太好.

另一个原因是速度.虽然对于Google Code Jam来说这不是问题,但在几乎所有比赛中,2x速度差距是"接受"和"时间限制"判断之间的差异.
换句话说,如果C++中的最佳算法运行速度比Ruby快10倍,那么可能意味着C++中的次优算法仍然比Ruby中的优秀算法快.如果可以实现O(n*logn),比赛作者通常不希望允许O(n ^ 2)提交.


只是评论你的比喻:世界语惨败于其目标.它的声音几乎就是Zamenhof的波兰方言,它的语法不自然而且复杂.它绝不是一种好的通用语言; 从很多方面来说,克林贡语看起来更像是一种自然的人类语言.我想,人们可以认为这与C++和Java有相似之处,但那是不公平的:)(另见http://www.xibalba.demon.co.uk/jbr/ranto/.)

4> Jerry Coffin..:

首先,我会质疑你的前提[编辑:或者我认为是一个前提 - 使用C++和Java的竞争对手同样如此好].例如,以下是Google最近的人工智能竞赛前100个地方和最后 100个地方的参赛作品使用的语言:

替代文字

使用C++和Java参赛者似乎没有在任何地方接近,以同样成功的那场比赛.使用Python的参赛者似乎也没有特别好,尽管他们的数量相当少,在这方面削弱了任何结论.

其次,当然,很多解释(正如其他人指出的那样)无疑只是熟悉每种语言的人数.现在可能有更多人参加Java课程,而不是编写任何Lisp,Scheme或Prolog的人数.

编辑:我认为第三种可能性就是多功能性.要选择一个极端的例子,Prolog是非常适合一些问题,但同样不佳适用于许多其他问题.很少有人能够(或至少确实)学习一种或两种以上的语言,足以在比赛中使用它们,所以大多数对这类事情感兴趣的人都可能会选择几乎可以在任何事情上都能很好地运作的语言,而不是试图为可能被选择的每个问题学习专门的语言.


原谅我的挑剔'但这应该是条形图而不是折线图......

5> Rose Perrone..:

在几乎所有Google Code Jam轮次中,更多表现更出色的参赛者都使用C++编写代码.

以下是Google Code Jam 2012第1A,1B和1C轮(从上到下列出)的语言统计信息.每轮参赛者人数分别为3,686人,3,281人和3,189人.

来自Google Code Jam 2012第1A轮的语言统计数据 来自Google Code Jam 2012第1B轮的语言统计数据 来自Google Code Jam 2012第1C轮的语言统计数据



6> Anycorn..:

有趣的问题,可能应该是社区维基.

查看各国的决赛入围人数:http://www.go-hero.net/jam/10/regions.请注意来自东欧和俄罗斯的人数.出于多种原因,这些地方拥有非常强大的C++社区以及Java.

在限定符中查看数字语言:http://www.go-hero.net/jam/10/languages/0和finals:http://www.go-hero.net/jam/10/languages/6.C++的开始时间不到一半,总决赛的比例为75%.要么优秀的程序员更喜欢C++,要么C++就是程序员.可能在你掌握C++的时候,其他事情变得微不足道.

你可以自由地得出自己的结论.



7> Petar Minche..:

首先,正如您所指出的C++并且Java是主流语言.这些自动意味着开始编程比赛的人将首先被介绍给他们 - 通过学习Lisp第一语言的方式:)我也经常参加这样的比赛 - 我C++用来竞争,尽管我最喜欢的语言是Java.只是我想练习另一种语言Java- 也是C++是一个不那么冗长,运行得更快,这对编程比赛很重要.现在,我认为 - 人们首先成为主流语言的专家.要参加编程比赛,您必须非常了解所使用的语言.你没有时间在互联网上搜索愚蠢的东西 - 比如忘了一个构造.只是速度是那里的一个重要因素.使用Lisp在比赛中,你必须喜欢它.我不认为那里有这么多人.如果我错了,请纠正我.老实说,你提到的专业知识就像简化了回溯:无论语言回溯是多么简单 - 声明一个方法,然后再为每一个可能的结果再次调用它.这简直太简单了.直到现在我还没有感觉到我正在使用的语言试图让我的脚步参加编程比赛.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/AI/detail/12107
推荐阅读
  • 如何解决《通过实践学习AI(感知器,神经网络和贝叶斯AI)》经验,为你挑选了0个好方法。algorithm,artificial-intelligence,人工智能,神经网络,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开... [详细]

  • 可以做web应用开发,在国内,豆瓣一开始就使用Python作为web开发基础语言。网络爬虫,谷歌的爬虫早期就是用跑Python写的。AI人工智能与机器学习,Python在科学计算领域一直有着较好的声誉,简洁清晰的语法以及丰富的计算工具。py... [详细]

  • 支付宝眼看这一步险棋,微信商业闭环的构建就要迈出成功的一步,怎能不做出自己的商业闭环?支付宝不做就是死,张小龙已经说的很明白了,未来这些小程序入口不在微信,微信是"工具",要去中心化。他认为在现实世界中才是小程序的入口,... [详细]

  • 2月17日,在其Beta1正式版发布的前12天,Ubuntu12.04LTS操作系统进行突击式的最后升级,“冻结”了该版本的所有特性,以后所剩下的就是修复Bug与系统美化工作了。我们发现,灵巧HUD接口正式(缺省)出现在该版本之中,HUD接... [详细]

  • 功能比较不错的脏话过滤系统,就是代码太长了,具体算法大家可以自己研究下asp,脏话过滤,人工智能,xml,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开... [详细]

  • PHP从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷php,node.js,go,python,程序员,ruby,mysql,redis,xml,json,服务器,swoole,udp... [详细]

  • 因为人工智能的核心计算全是C语言写好的底层,要想编写人工智能的逻辑,就需要一个从其他语言到C语言的接口,Python是门槛最低最容易的。python,人工智能,c语言,linux,DevBox,在线流程图,编程,编程问答,程序员,开发者工具... [详细]

  • 图床就是一个在网络上存储图片的地方,目的是为了节省本地服务器空间,加快图片打开速度。今天就推荐几款超简单的图床工具,感兴趣的朋友一起看看吧免费图床程序,免费的图床,最好的图床,服务器,https,git,go,macos,windows,l... [详细]

  • linux云计算可以实现随时随地、便捷地、随需应变地从可配置计算资源共享池中获取所需的资源(例如网络、服务器、存储、应用及服务),资源能够快速供应并释放,使管理资源的工作量和与服务提供商的交互减小到最低限度。linux,人工智能,安全,服务... [详细]

  • 更多的程序员更倾向于Python,毕竟Python在人工智能、数据分析、云计算等领域具有更好的发展前景!python,程序员,人工智能,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,uni... [详细]

  • 本文介绍一下Perl文件句柄的概念,要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将Perl文件句柄在内存中的地址和要拷贝的字节数传送给操作系统Perl文件句柄,perl,人工智能,DevBox,在线流程图,编程,编程问答... [详细]

  • 这篇文章主要介绍了再谈PHP未来之路,对PHP感兴趣的同学,可以看一下PHP,php7,未来,php,swoole,百度,程序员,c#,服务器,facebook,iphone,websocket,分布式,rpc,nginx,go,算法,mv... [详细]

  • 40个迹象表明你还是PHP菜鸟,阅读40个迹象表明你还是PHP菜鸟,这些迹象不只是用来告诉我是菜鸟,还告诉我还有很多要学习的。简介40个迹象的英文版权归ReinholdWeber所有,中译文作者yangyang(akadavidkoree)... [详细]

  • 如何解决《Python或Ruby用于基于Web的人工智能?》经验,为你挑选了1个好方法。python,artificial-intelligence,ruby-on-rails,prolog,人工智能,ruby,DevBox,在线流程图,编... [详细]

  • Android开发、Java网站建设、Java企业级应用开发、Java游戏开发,Java也可以用来进行游戏开发,但不太适合编写大型游戏,所以这个方向不太推荐。以及Java大数据开发。java,android,人工智能,DevBox,在线流程... [详细]

  • 如何解决《多线程A*用Java或Lisp或C#搜索》经验,为你挑选了1个好方法。search,multithreading,artificial-intelligence,a-star,人工智能,c#,DevBox,在线流程图,编程,编程问... [详细]

  • 这篇文章主要介绍了Lua和C++的通信流程代码实例,本文是上一篇的DEMO,本文用代码讲解Lua和C++之间的通信,需要的朋友可以参考下Lua,C++,通信流程,https,lua,c语言,人工智能,DevBox,在线流程图,编程,编程问答... [详细]

  • 如何解决《解决水壶问题》经验,为你挑选了1个好方法。theory,math,computer-science,人工智能,算法,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,... [详细]

  • 这篇文章主要介绍了Ubuntu20.04环境安装tensorflow2的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧Ubuntu20.04安装tensorflow... [详细]

  • Python诞生之初就被誉为最容易上手的编程语言。进入火热的AI人工智能时代后,它也逐渐取代Java,成为编程界的头牌语言。下面这篇文章主要给大家总结介绍了一些关于python的书单,需要的朋友可以参考下。python初学者的书籍,pyth... [详细]

相关标签
  

闽ICP备14008679号