首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CodeForces问题中的歧义-- HashSet Vs LinkedHashSet的用法

CodeForces问题中的歧义-- HashSet Vs LinkedHashSet的用法
EN

Stack Overflow用户
提问于 2020-08-06 08:43:14
回答 1查看 83关注 0票数 1

昨天我在解决一个Codeforce问题。问题的网址是

我只会在以下简单地解释这个问题。

给定一个二进制字符串,将其划分为最小数目的子序列,使字符串中的每个字符恰好属于一个子序列,并且每个子序列看起来像"010101 .“或者"101010 .“(即子序列不应包含两个相邻的零或1)。

现在,对于这个问题,我昨天在比赛中提交了一个解决方案。这是解决方案。它被暂时接受,在最后的测试用例中,时间限制超过了状态。

所以今天,我再次提交了另一个解决方案,这通过了所有的案例。

在第一个解决方案中,我使用了HashSet,在第二个解决方案中,我使用了LinkedHashSet。我想知道,为什么HashSet不把所有的案子都办好?这是否意味着每当我需要LinkedHashSet实现时都应该使用Set?我看了的文章,发现HashSetLinkedHashSet表现得更好。但为什么我的代码在这里不起作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 09:28:16

这个问题可能会在Codeforces上得到更多的答复,但无论如何我还是会在这里回答的。

竞赛结束后,Codeforce允许其他用户通过编写自定义输入在其他用户的程序上运行来“黑”解决方案。如果维护用户的程序在自定义输入上运行缓慢,则他们提交代码的状态将从“接受”更改为“超出时间限制”。

您的代码之所以从“接受”更改为“超过时间限制”,是因为有人创建了一个“反哈希测试”(您的哈希函数在该测试上导致了许多冲突),您的程序运行速度比平时慢。如果您对如何生成这样的测试感兴趣,您可以在Codeforces上找到几个帖子,比如:https://codeforces.com/blog/entry/60442

正如@Photon所链接的,Codeforces上有一篇文章解释了为什么您应该避免使用Java.HashSet和Java.HashMap:https://codeforces.com/blog/entry/4876,这主要是由于反哈希测试。在某些情况下,从平衡的BST中添加额外的log(n)因子可能不是那么糟糕(通过使用TreeSetTreeMap)。在许多情况下,额外的log(n)因素不会使您的代码超时,并且它为您提供了免受反哈希测试的保护。

如何确定算法是否足够快以添加log(n)因子?我想这是伴随着一些经验,但大多数人建议进行某种计算。大多数在线评判(包括Codeforces)显示了允许程序在特定问题上运行的时间(通常在1到4秒之间),并且在执行计算时可以使用每秒10^9固定时间操作作为经验法则。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63279911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档