【发布时间】:2022-01-22 19:42:37
【问题描述】:
在 java 中,我希望能够始终维护按物种分类的鱼类集合(因此使用 HashMap),同时能够从所有物种中选择一个随机元素,除了具有恒定时间复杂度的物种。例如,以下代码可以完成这项工作,但复杂度为 O(元素数量):
import java.util.*;
HashMap<String, ArrayList<Fish>> fishesBySpecies = new HashMap<>();
// Insert some fishes...
// Fish has a String attribute that describes its species
// Now we want to pick a random Fish that isn't from the unwantedSpecies
String unwanted = "unwanted species";
ArrayList<Fish> wantedSpecies = new ArrayList<>();
for (String species : fishesBySpecies.keySet()) {
if (!Objects.equals(species, unwanted)) {
wantedSpecies.addAll(fishesBySpecies.get(species));
}
}
// Finally !
int randomIndex = new Random().nextInt(wantedSpecies.size());
Fish randomElement = wantedSpecies.get(randomIndex);
如果可能的话,知道如何以恒定的时间复杂度来做到这一点吗?谢谢!
【问题讨论】:
-
@Sweeper 抱歉,我编辑了我的问题,然后忘记了最初的标题,现在已修复。
-
当然,在恒定的时间复杂度下这是不可能的。但显然,您可以通过使用 Stream API 重写代码以使其看起来更复杂,甚至不提及时间复杂度......
-
@Holger 最后我找到了一个使用地图的 O(物种数量)的解决方案,但它对我的要求太具体了,我无法唤起它。我相信它不太可能帮助其他人。我接受了第一个答案,因为它帮助我更好地理解我想要做什么。
-
您的问题确实已经有 O(元素数量),正如您自己所说的那样。因此,如果您不想要更好的时间复杂度,这无论如何都是不可能的,那么就不清楚您要的是什么。选择一个没有中间
ArrayList的随机元素是可能的,如果你愿意,只要问正确的问题。
标签: java sorting collections random-access