Дана карта, на ней города, которые имеют координаты X, Y, Z.
Нужно обозначить каждый город ОДНИМ числом исходя из его координат, да так, чтобы можно было сказать, к какому городу ты ближе всего находишься твои X, Y, Z тебе известны
Чет в треде какие-то сложные ответы. Пишу первую же мысль: Можно координату обозначать, разделяя x y и z 0, то есть условно говоря у нас есть x y z 10, 50 и 48 соответственно. Тогда число, обозначающее эту координату будет 10050048. Но тогда у нас остается проблема отрицательных координат. Тут у меня первая мысль такая: Можно в дробной части например + обозначать цифрой 1, а - цифрой 2, тогда если у нас координаты, допусти 10, -50, 48, то все число у нас будет таким: 10050048.121. Как идея? мимо-Васян-helloworldер
>>1327006 Не будет такое работать. Как мы потом сравним, к какой координате нам ближе? Ты же должен будешь свою точку вычесть из точки всех городов, и какой результат окажется ближе с 0, к тому городу ты и ближе
>>1326944 Числом конечно. Это просто должна быть 1 запись, типа индекса по которому легко можно было бы сказать, к какому городу оно ближе. Цифрой такое не сделать, городов ведь больше 10 (0-9)
>>1327132 Лол сука. Причем тут расстояние? Расстояние относительно чего? У каждого города должно быть обозначение 1 числом, чтобы по этому числу можно было сказать, тот или иной это город. Число должно быть выведено на основе его координат
Если же вопрос именно в том, как закодировать 3 числа одним, то есть несколько способов. Первый - закодировать X, Y, Z в виде битовой строки. Пусть каждое число X, Y, Z - битовая строка произвольной длины. Дальше кодируем типа. 1x1x1x1x1x1x1x1x1x001y1y1y1y1y1y1y1y001z1z1z1z1z1z1z1z1z где иксы, игреки и зеты - это собственно биты наших чисел. Два нуля, идущих подряд - признак отделения X от Y и Y от Z.
Если у нас, не дай бог, X, Y, Z - непрерывные числа (как это называется, R короче), нужна https://en.wikipedia.org/wiki/Space-filling_curve. Потому что "дана карта" - значит объем, в котором есть города, конечномерен. А значит можно отобразить наш 3д-кубик на фрактал, который покрывает весь этот кубик одной длинной кривой. Результирующее число тоже будет непрерывным.
>>1327152 И да, еще раз, РАССТОЯНИЕ в километрах или в метрах не нужно, нужно просто какое то абстрактное число, по которому можно будет судить кто ближе, а кто дальше
>>1327152 Ты изначально очень криво сформулировал задачу. Если мои координаты фиксированы (что по твоей формулировке выглядит так), то каждому городу я ставлю в соответствее число (X-X0)^2+(Y-Y0)^2+(Z-Z0)^2, где Z0, Y0, Z0 - мои координаты. Тогда город с минимальным числом будет ближайшим городом. Видимо, ты имел в виду что-то посложнее, раз не понимаешь, что я имею в виду.
Еще один алгоритм. Находим минимальное расстояние между двумя городами. Строим октодерево глубины достаточной, чтобы перекрыть машинный эпсилон. Дальше тройками бит кодируем путь по этому дереву к ноде в виде положения города. Дальше используем стандартный алгоритм поиска ближайшего соседа в октодереве.
>>1327195 >У тебя тогда расстояние от точки до точки будет по этой кривой, а не прямой. Есть и обратное преобразование, из точки на кривой получаешь X, Y, Z и вычисляешь точное расстояние. С этим проблем вообще нет. https://github.com/galtay/hilbert_curve А так на этих кривых работают вероятностные алгоритмы во всяких AI-йобах типа faiss - ведь кривая сохраняет пространственствую локальность, поэтому бликие точки скорее всего будут близки и на кривой. Проблема в том, что я программист и мне все эти действительные числа с бесконечной десятичной записью не очень приятны сами по себе, проще упаковать X, Y, Z в одно число тупо через битовое представление. Скажу тебе по секрету, что вся оперативная память компьютера это одно большое число.
>>1327206 Ну так-то еще проще. Эквидистантные кривые между городами образуют многоугольники (многогранники в 3д случае). Пишем функцию, которая по координатам X, Y, Z выдает номер многоугольника.
>>1327279 Кстати на ту же тему - шазам ищет среди миллионов аудиозаписей за секунду. У него музыка ведь тоже закодирована некими числами, но они же не сравнивают каждую песню с той, что ты загрузил, а сразу тыкает в нужную (ну или в приблизительно нужную и уже там пару сотен треков сравнивает досконально)
>>1326942 (OP) Координаты целочисленные? Тогда можно сделать стандартную схему пересчёта в натуральное множество: 0 (0;0;0), 1(1;0;0), 2(1;1;0), 3(1;1;1), 4(2;1;1), etc.
>>1327594 Смысл? Оно ничего общего с этой задачей не имеет, мне нужен был быстрый поиск по параметрам (или координатам, как угодно). Просто выбирал ближайшие значения, потом из массива "примерных" значений выбирал точные. Скорость всё равно такая себе, ну пойдет думаю, в 10 раз быстрее начального варианта так или иначе
>>1326942 (OP) Переводишь в сферическую систему координат относительно себя. Расстояние - целая часть числа, углы - дробная (например, чередованием разрядов). Ближайший ищется тривиально. Восстановить X, Y, Z можно обратным преобразованием со сдвигом на свои координаты.
>>1326942 (OP) Зачем на карте координата Z? Во-первых, даже если города имеют разную высоту над уровнем моря, они не могут находится друг на друге. То есть не может быть случая, когда X и Y совпадают, но Z имеет разные значения. Во-вторых, сама карта имеет только 2 координаты, она не может быть 3-х мерной. Поэтому задача не имеет смысла, так как Z в данном случае не нужен.
>>1326942 (OP) Зарезервировать последний знак определённой системы счисления под разделитель. Всё: у тебя одновременно и координаты и их разделение, и всё это вполне себе число.
Нужно обозначить каждый город ОДНИМ числом исходя из его координат, да так, чтобы можно было сказать, к какому городу ты ближе всего находишься твои X, Y, Z тебе известны