上周末我参加了一场编程比赛(ICPC的预选赛),我正试图解决一个问题,其中包括将0 <= i <= 1,000,000
范围内的整数分解为素数。
我的第一个想法是“哦,不,因为整数是在NP,我们需要找到一种方法来避免花时间在它上面。”我们在Java工作。作为一名C程序员,我的第一直觉是使用脚本预先计算高达1,000,000的所有素数,将其格式化为Java数组,并尝试将其插入到我的代码中。我的理由是它节省了我们在定时部分运行像Eratosthenes筛子这样的东西的时间,通过像n因子这样的东西来减少时间复杂度,并且通过它轻而易举。
然后我被“代码太大”错误命中,我的几十万int
数组被编译器拒绝了。由于竞争规则,无法将其读入文件,或将其存储在除包含具有main
方法的类的.java文件之外的任何位置。
我尝试将其分解为类似100,000 int
块的内容,但是因为它仍然太大而无效(除了Java 7文档之外我们没有任何建议,我无法找到关于“代码太大”错误消息的任何内容)。我们最终放弃了,尝试了另一种方法,并让它运作起来,但它最终耗费了我们在比赛总时间的1/4,并且显着损害了我们的得分。
所以,我的问题是:用查找表解决这个问题是否有任何理智的方法?是不是不可能在Java程序中获得一个巨大的预编译查找表?
我也很好奇这种语言限制背后的原因......它是一种安全的东西,不知怎的?为什么编译器会限制方法的字节码大小?