Представьте, что дерево было пронумеровано в обратном порядке.
15
7
14
3
13
6
12
1
11
5
10
2
9
4
8
В этом случае это будет просто логарифм числа, округленного в меньшую сторону.Теперь мы просто вычитаем это число из числа раундов, и все готово.
reverse_number = total_matches - match_number + 1;
reverse_match_round = floor(log(reverse_number, 2));
match_round = total_rounds - match_round;
(Обратите внимание, что reverse_match_round
на самом деле 0-проиндексировано, в отличие от match_round. Однако, поскольку мы вычитаем его из total_rounds
, проще сохранить его таким образом, чем индексировать его 1. Если вы предпочитаете индексировать его 1, просто добавьте +1
к каждой из двух последних строк.)