Я хочу выбрать верхний «диапазон» карт на основе процента. У меня все мои возможные 2 карточные руки организованы в массив в порядке силы руки, например:
AA, KK, AKsuited, QQ, AKoff-suit ...
Я выбрал верхние 10% раздач, умножив длину массива карт на процент, который дал бы мне индекс последней карты в массиве. Тогда я бы просто сделал копию подмассива:
Arrays.copyOfRange(cardArray, 0, 16);
Однако теперь я понимаю, что это неправильно, потому что существует больше возможных комбинаций, скажем, Ace King off-масти - 12 комбинаций (т.е. туз одной масти и короля другой масти), чем есть комбинации, скажем, пара тузов - 6 комбинаций.
Когда я выбираю верхние 10% рук, поэтому я хочу, чтобы они основывались на верхних 10% рук пропорционально общему количеству комбинаций из двух карт - 52 выбирают 2 = 1326.
Я думал, что мог бы иметь массив целых чисел, в котором каждый индекс содержал бы общую сумму всех комбинаций до этой точки (каждый индекс соответствовал бы руке из исходного массива). Итак, первые несколько индексов массива будут:
6, 12, 16, 22
потому что есть 6 комбинаций AA, 6 комбинаций KK, 4 комбинации AKsuited, 6 комбинаций QQ.
Тогда я мог бы выполнить бинарный поиск, который выполняется во время BigOh (log n). Другими словами, я мог бы умножить общее количество комбинаций (1326) на процент, найти первый индекс, меньший или равный этому числу, и это было бы индексом исходного массива, который мне нужен.
Интересно, есть ли способ сделать это в постоянное время?