【发布时间】:2014-11-16 19:27:40
【问题描述】:
我正在设计棒球联盟前 5 名击球手的记分牌。我使用TreeMap 和player_name 作为value 和Player 作为key。
Map<Player, String> players = new TreeMap<>(Collections.reverseOrder());
Player 班级按照联盟中的得分进行自然排序
compare(this.leagueRuns, otherPlayer.leagueRuns)
leagueRuns 在比赛期间不断更新,前 5 名击球手记分牌也应相应更改。下面是更新球员联赛并重新插入TreeMap 的代码。更新后,检索并显示 Map 中的 TOP 5 条目。
public void updateRuns(String playerName, int runsScored) {
Iterator<Entry<Player, String>> playersEntries = players.entrySet().iterator();
Player player = null;
while (playersEntries.hasNext()) {
Entry<Player, String> currentPlayer = playersEntries.next();
if (currentPlayer.getValue().equalsIgnoreCase(playerName)) {
player = currentPlayer.getKey();
}
}
players.remove(player);
player.addRuns(runsScored);
players.put(player, player.getName());
}
一切正常,但我有以下顾虑:
- 为了对
Player进行排序,我在TreeMap中将其用作Key。但是必须遍历整个Map才能找到正在更新的Player。因此时间复杂度从 O(1) 降低到 O(n)。并且变得更糟,因为我必须删除Player,更新它并重新插入,否则更改将不会生效。因此O(n + logn)。有没有办法按照自然顺序对Player进行排序,并且还能够在 O(1) 中进行搜索。我想重新插入是不可避免的。 - 每次为玩家更新
leagueRuns,都必须重新订购整个TreeMap。你认为创建一个单独的 TOP 5 击球手最小堆可以解决这个问题并且是一个可行的想法。 - 有关设计或提高时间复杂度的任何提示。
【问题讨论】:
-
@DavidWallace 搜索和更新
Player可以使用 `HashMap在 O(1) 中完成。但是构建一个单独的最高得分者列表的总成本将是 O(nlogn)。
标签: java data-structures heap time-complexity treemap