Требуется помощь Попытка упростить этот алгоритм для сопоставления точек на произвольно большой 2d-плоскости с уникальными целыми числами
Итак, как сказано в заголовке, мне нужна помощь в попытке сопоставить точки с 2-мерной плоскости с числовой линией таким образом, чтобы каждая точка была связана с уникальным положительным целым числом. Другими словами, мне нужна функция f:ZxZ->Z+, и мне нужно, чтобы f был инъективным. Кроме того, мне нужно бежать в разумные сроки.
Таким образом, я думал о том, чтобы просто подсчитывать точки, начиная с (1,1) и по спирали наружу.
Ниже я написал код Python, чтобы сделать это для некоторой точки (i, j)
def plot_to_int(i,j):
a=max(i,j) #we want to find which "square" we are in
b=(a-1)^2 #we can start the count from the last square
J=abs(j)
I=abs(i)
if i>0 and j>0: #the first quadrant
#we start counting anticlockwise
if I>J:
b+=J
#we start from the edge and count up along j
else:
b+=J+(J-i)
#when we turn the corner, we add to the count, increasing as i decreases
elif i<0 and j>0: #the second quadrant
b+=2a-1 #the total count from the first quadrant
if J>I:
b+=I
else:
b+=I+(I-J)
elif i<0 and j<0: #the third quadrant
b+=(2a-1)2 #the count from the first two quadrants
if I>J:
b+=J
else:
b+=J+(J-I)
else:
b+=(2a-1)3
if J>I:
b+=I
else:
b+=I+(I-J)
return b
Я почти уверен, что это работает, но, как видите, это довольно громоздкая функция. Я пытаюсь придумать способ упростить эту логику «спирального счета». Или, возможно, есть другой метод подсчета, который проще кодировать, который тоже будет работать.
1 ответ
Вот полусырая идея:
- Для каждой точки рассчитайте
f = x + (y-y_min)/(y_max-y_min)
- Найдите наименьшую дельту между любыми заданными
f_n
иf_{n+1}
. Умножьте все значения на1/d
так что все значения разнесены по крайней мере на 1. - Возьми
floor()
из всехf
значения.
Это похоже на проекцию на ось x, но она пытается распределить значения так, чтобы сохранить уникальность.
ОБНОВИТЬ:
Если вы не знаете всех данных и вам потребуется вводить новые данные в будущем, возможно, есть способ жестко закодировать произвольно большую или малую константу для
y_max
и
y_min
на шаге 1 и произвольная дельта
d
для шага 2 в соответствии с границами ожидаемых значений данных. Или способ вычислить их значения в соответствии с ограничениями арифметики с плавающей запятой.