Как вы можете создать уникальный ключ для двух взаимозаменяемых целых чисел? - PullRequest
2 голосов
/ 15 сентября 2011

Я пытаюсь написать простой механизм кэширования для метода Евклида по нахождению GCD из двух чисел:

gcd(a,0) = a
gcd(a,b) = gcd(b, a % b)

Обратите внимание, что gcd(a,b) == gcd(b,a).

Для кеша мне нужно найти ключ для данного (a,b) или (b,a), с 0 < a < 20 и 0 < b < 20.

Конечно, я мог бы использовать key = a*20 + b или key = a + b*20, но они асимметричны - ключ для (1,5) отличается от ключа для (5,1).

Как я мог это реализовать?

Ответы [ 2 ]

5 голосов
/ 15 сентября 2011

Сначала отсортируйте числа.

key = a > b ? b*20 + a : a*20 + b;
2 голосов
/ 15 сентября 2011

Пусть c будет min (a, b), а d будет max (a, b). Тогда ваша хеш-функция c * 20 + d симметрична относительно a и b.

...