一、引言
如果现在你想制作一张二维地图,上面要标出西安的兵马俑、北京的故宫、上海的东方明珠,还有苏州的每一座园林、武汉的每一家热干面馆,这做得到吗?
有人说,做得到,顺便打开了高德地图或者百度地图。可是别忘了,地球是个球体,上面的这些地点其实都位于球面上。所以所有的二维平面地图都有一定程度的失真 —— 比如俄罗斯在地图上似乎有中国的三四倍大小,但实际面积却只有 1.7 倍。
好吧,那就做个三维地图就好了?就像地球仪那样。这样确实有道理,但想像这么一个场景:你想知道从北京的故宫沿直线走路去上海的东方明珠所需要的时间,于是你找到了它们在三维地图中分别对应的两个点 —— 下一步,是测量下这两个点的直线距离,然后除以比例尺,再除以走路的速度吗?
答案是否定的!
因为你走路只会在球面上走,所以你所谓的“沿直线走路”,并不是真的直线,而是球面上连接两点的弧线中最短的那条。所以球面上两点之间的“距离”,其本质乃是球面上一段弧的长度,而非在三维空间中直接沿直线相连的长度。要想从三维地图上知道你走路所需要的时间,你需要拿一把尺子,先把零刻度线对准北京故宫,再向着上海东方明珠的方向,缓缓沿球面转动尺子,直到某个刻度线碰到了上海的东方明珠;这时你把此时尺子的读数除以比例尺,再除以走路速度,这才是你想计算的时间。
那么问题来了 —— 给定一个球面,你能否找到一种办法,把球面上的每个点都唯一地映射到三维空间中,使得每个点原本在球面上的距离,恰好等于映射后在三维空间中的直线距离?如果三维不行,四维呢?五维呢?$n$ 维呢?
这正是本次 UER #10 的 B 题 重构元宇宙 想讨论的问题。该题大意是:给定 $n$ 个点两两之间的距离,你能把他们画在 $k$ 维空间中,且保持所有点两两之间的距离不变吗?还有个附加条件是,对两点之间的距离的查询次数不能超过 $n(k+1)$。为避免精度误差,原题的点的坐标是随机的。这里还有一个加强版,去掉了这个随机性的条件,供勇士们挑战。
所以,要想知道球面上的距离能不能被映射为某个欧式空间的距离,我们只需要先假设它们可以表示为 $k$ 维空间中的距离,然后带到这道 B 题的程序里,看看程序输出的结果是否真的满足假设。
实际生活中或者科学研究中,我们会碰到很多种“距离”,它们的具体定义取决于实际的应用,而非总是像欧式空间一样,把每一维坐标相减,平方加起来,再开根号。例如上面举例的球面上的距离,人们是为了地理上的用途而定义它,在计算中国到美国的飞机行程时也会使用它。如果有一个想从中国去往美国的旅行者,对欧式距离爱得深沉,一定要让自己旅行的时间与欧式距离成正比,那他只能强行通过钻入地下、穿过地心的方式去往美国了。
那么这道题到底该怎么做呢?
阅读更多……