Как найти самый большой элемент списка
Если список упорядочен, то самый большой элемент - это первый (или последний) элемент списка.
Если список не упорядочен, то:
Element biggest = list.get(0);
for (Element e : list) {
if (e.compareWith(biggest) > 0) {
biggest = e;
}
}
Например, предположим, у нас есть 1 000 000 шахматистов, и нам поручено найти лучшего шахматиста в группе. Теперь мы хотим минимизировать максимальное количество игр, в которые играет любой игрок.
С новым ограничением последнего предложения ...
Ответ № 1: ноль игр. Сравните рейтинг шахматиста, и тот, у кого лучший рейтинг, является объективно лучшим игроком ... согласно рейтингу.
Ответ # 2: не более ceiling(log2(nos_players))
игр, сыгранных на игрока. Турнир на выбывание / выбывание исключает половину игроков в каждом раунде, поэтому количество раундов и, следовательно, максимальное количество игр, сыгранных любым игроком, составляет ceiling(log2(nos_players))
.
Соответствующий алгоритм тривиально:
List players = ...
while (players.size() > 1) {
List winners = new ArrayList();
Iterator it = players.iterator();
while (it.hasNext()) {
Player p1 = it.next();
if (it.hasNext()) {
Player p2 = it.next();
int result = p1.compareTo(p2);
if (result < 0) {
winners.add(p2);
} else if (result > 0) {
winners.add(p1);
} else {
throw new Exception("draws are impossible in chess");
}
} else {
winners.add(p1); // bye
}
}
players = winners;
}
(Кроме того: если у вас также есть заранее определенный рейтинг для игроков, а число игроков N
не менее чем на 2 меньше ceiling(log2(N))
, вы можете договориться о том, чтобы лучшие 2 игрока получили прощание в одном раунде. Если 2 лучших игрока встретятся в финале, тогда каждый сыграет меньше, чем ceiling(log2(N))
игр ... что является улучшением решения, в котором байты распределяются случайным образом.)
На самом деле, ответ № 2 не работает для игры в шахматы, поскольку он не учитывает тот факт, что значительный процент реальных шахматных партий составляют ничьи; ни один из игроков не выигрывает. Действительно, тот факт, что игрок A побил игрока B в одной игре , не означает , что означает, что A - лучший игрок, чем B. Чтобы определить, кто является лучшим из любых двух игроков, они должны сыграть несколько партий и подсчитать победы и поражения. Короче говоря, представление о том, что для шахматистов существует отношение «лучше чем», ПОЛНОСТЬЮ нереалистично.
Несмотря на вышеприведенные пункты, нокаут НЕ является практическим способом организации шахматного турнира. Все будут находиться на стойке организатора турнира и жаловаться на то, что им приходится играть в игры с игроками намного лучше (или хуже), чем они сами.
Реальный шахматный (или аналогичный) турнир работает так, что вы выбираете количество раундов, которое хотите сыграть первым. Затем в "круговом" турнире вы выбираете N лучших игроков по рейтингу. и договориться, чтобы каждый игрок играл друг за друга. Игрок с лучшим результатом выигрыша / ничьей является победителем, и в случае ничьей вы используете (скажем) «сумму очков противников» в качестве прерывателя ничьей. Есть и другие стили турниров, которые обслуживают больше игроков / меньше раундов.