Несмотря на то, что вы впоследствии говорили, что на самом деле у вас есть double
для хранения информации, я подумал, что все же могу поделиться некоторыми мыслями о том, как сделать это с 32-разрядным целым числом.
Во-первых, чтобычтобы эти числа сортировались в порядке убывания сначала, а во втором порядке времени, вы хотите, чтобы счет занимал места с более высокими значениями, а отметка времени занимала более низкие.Чтобы разместить счет в местах с более высокими значениями, мы должны выбрать его умножить на некоторый постоянный коэффициент.Наибольшее число, которое может быть представлено 32-разрядным целым числом без знака, составляет 4 294 967 295, и мы имеем диапазон оценок от 0 до 1 000 000.Это дает нам множитель 4 294.
Затем у нас есть позиции с более низким значением, занятые отметкой времени - просто нужно добавить это. Это дает нам:
N = SCORE * 4294 + TIMESTAMP;
Обратные преобразованияявляются:
SCORE = N / 4294;
TIMESTAMP = N % 4294;
Однако обратите внимание, что диапазон, который это позволяет для TIMESTAMP
, составляет от 0 до 4293 включительно.Все, что выше, переполнилось бы частями N
, занятыми SCORE
.Если TIMESTAMP
- это просто число секунд (начиная с 4293 для самого раннего счета и обратного отсчета), это дает нам максимальное время, составляющее чуть более 71 минуты от самого раннего счета до самого последнего - вероятно, недостаточно.
Это просто ограничение на количество различных сегментов, которые вы можете представить с помощью 32-битного целого числа - чтобы иметь возможность представлять более четкие временные метки с помощью этой модели, вам нужно уменьшить количество отдельных показателей, которые вы можете представить.
Однако, обратите внимание, что мы не хотим, чтобы временная метка была временной меткой - мы просто хотим, чтобы она была монотонной, упорядоченной по счетам.В качестве альтернативы мы можем сохранить счетчик.Инициализируйте счетчик 4293. Когда появится новый счет, сохраните его с текущим значением счетчика в качестве его «метки времени», затем уменьшите счетчик.Это позволит сохранить 4294 различных рекорда до того, как счетчик закончится.
В качестве дальнейшего уточнения, мы можем отметить, что нас интересует только порядок в пределах того же значения SCORE
.Это предлагает другую альтернативу: когда приходит новый высокий балл, найдите текущее самое низкое значение TIMESTAMP для этого балла.Уменьшите его на 1 и используйте для «отметки времени» нового счета (если это первый раз, когда было отправлено это SCORE
, используйте 4293 в качестве отметки времени).Это позволит получить 4294 балла за отдельное значение.