Java CodeForces问题中的歧义——HashSet与LinkedHashSet的使用
昨天我在解决一个代码部队的问题。问题的URL是 我将在下面简短地解释这个问题 给定一个二进制字符串,将其划分为最少数量的子序列 以这样一种方式,字符串的每个字符只属于一个字符 子序列和每个子序列看起来像“010101…”或“101010” …”,即子序列不应包含两个相邻的零或 一个) 现在,对于这个问题,我在昨天的比赛中提交了一个解决方案。这是最新的。它被临时接受,并且在最后的测试用例中获得了超过时间限制的状态 所以今天,我再次提交了另一份,通过了所有的案例Java CodeForces问题中的歧义——HashSet与LinkedHashSet的使用,java,algorithm,set,hashset,linkedhashset,Java,Algorithm,Set,Hashset,Linkedhashset,昨天我在解决一个代码部队的问题。问题的URL是 我将在下面简短地解释这个问题 给定一个二进制字符串,将其划分为最少数量的子序列 以这样一种方式,字符串的每个字符只属于一个字符 子序列和每个子序列看起来像“010101…”或“101010” …”,即子序列不应包含两个相邻的零或 一个) 现在,对于这个问题,我在昨天的比赛中提交了一个解决方案。这是最新的。它被临时接受,并且在最后的测试用例中获得了超过时间限制的状态 所以今天,我再次提交了另一份,通过了所有的案例 在第一个解决方案中,我使用了Hash
在第一个解决方案中,我使用了
HashSet
,在第二个解决方案中,我使用了LinkedHashSet
。我想知道,为什么不清除所有的案例?这是否意味着每当我需要Set
实现时,我都应该使用LinkedHashSet
?我看了这篇文章,发现HashSet
比LinkedHashSet
性能更好。但是为什么我的代码在这里不起作用呢?这个问题可能会得到更多关于Codeforces的回复,但无论如何我会在这里回答
竞赛结束后,Codeforces允许其他用户通过编写自定义输入来“破解”解决方案,以便在其他用户的程序上运行。如果防御用户的程序在自定义输入上运行缓慢,则其代码提交的状态将从“已接受”更改为“已超出时间限制”
具体来说,您的代码从“已接受”更改为“超出时间限制”的原因是有人创建了一个“反哈希测试”(一个哈希函数导致多次冲突的测试),您的程序在该测试上运行得比平时慢。如果您对这些测试是如何生成的感兴趣,您可以在Codeforces上找到几篇文章,比如下面这篇:
正如@Photon所链接的,在Codeforces上有一篇文章解释了为什么应该避免使用Java.HashSet和Java.HashMap:,这主要是由于反散列测试。在某些情况下,从平衡的BST中添加额外的log(n)
因子可能没有那么糟糕(通过使用TreeSet
或TreeMap
)。在许多情况下,一个额外的log(n)
因子不会使代码超时,它可以保护您免受反哈希测试的影响
如何确定您的算法是否足够快,可以添加
log(n)
因子?我想这需要一些经验,但大多数人建议进行某种计算。大多数在线判断(包括Codeforces)都会显示允许您的程序在特定问题上运行的时间(通常在1到4秒之间),并且您可以在执行计算时使用10^9
每秒恒定时间操作作为经验法则。@Photon这一个称为Java 6/7。也适用于Java8+吗?