什麼是切比雪夫距離?什麼是曼哈頓距離?
傻傻分不清,沒關係,看:
曼哈頓距離設平面空間內存在兩點,它們的座標為(x1,y1),(x2,y2)則dis=|x1−x2|+|y1−y2|
即兩點橫縱座標差之和
切比雪夫距離
設平面空間內存在兩點,它們的座標為(x1,y1),(x2,y2)
則dis=max(|x1−x2|,|y1−y2|)
即兩點橫縱座標差的最大值
比如這個圖,a,b兩點的曼哈頓距離就是
切比雪夫距離就是
既然都提到這兩個距離了,就免不了要講講它們的相互轉化
將乙個點(x,y)的座標變為(x+y,x−y)後,原座標系中的曼哈頓距離 = 新座標系中的切比雪夫距離這個證明也很容易,有興趣的同學可以來皮一下將乙個點(x,y)的座標變為
我就不在這裡贅述了
然而有什麼用呢??這麼多奇奇怪怪的定義,真是讓人摸不著頭腦
但事實上,可有用了呢
切比雪夫距離由於要求max 很多時候不是很好優化,對於乙個點,計算其他點到該的距離的複雜度為o(n)(因為要列舉)
而曼哈頓距離只有求和以及取絕對值兩種運算,我們把座標排序後可以去掉絕對值的影響,進而用字首和優化,可以把複雜度降為o(1),也可以支援很多次的運算
而有乙個細節需要注意一下:
在切比雪夫距離轉曼哈頓距離的時候,座標本是要除以2的,但考慮到精度的問題,我們一般都會將除以2 這一步操作放到最後
這樣也是正確的,形象的理解可以說成,曼哈頓座標系是通過切比雪夫座標系旋轉45度後,再縮小到原來的一半得到的。
是不是手癢癢了??來吧,練一道入門題 松鼠聚會(tjoi 2013)
#include#define ll long long
#define n 100009
#define in read()
using namespace std;
inline int read()
return f==1?res:-res;
}ll ans=1ll<<50ll,sumx[n],sumy[n];//一開始ans又初始小了~~~~~悲傷
int n,x[n],y[n],xx[n],yy[n];
ll solve(int now)
int main()
sort(xx+1,xx+n+1);
sort(yy+1,yy+n+1);
for(i=1;i<=n;++i)
for(i=1;i<=n;++i)
ans=min(ans,solve(i));
cout<
return 0;
}
總結 曼哈頓距離轉切比雪夫距離
我們在用二維樹狀陣列的時候,可以得到乙個邊與座標軸平行的矩形內點集的資訊。如果我們需要得到得到到乙個點的距離小於等於k的點的資訊呢。這些點構成的不在是邊也座標軸平行的矩形,而是乙個對角線與座標軸平行的菱形。可以通過轉化,使得整個座標軸旋轉45 然後我們菱形變成了方方正正的矩形,又可以用而二維樹狀陣列...
曼哈頓距離和切比雪夫距離轉化
曼哈頓距離和切比雪夫距離 兩個點的距離定義為點 x,y 和它周圍的 8 個點 x 1,y x 1,y x,y 1 x,y 1 x 1,y 1 x 1,y 1 x 1,y 1 x 1,y 1 距離為 1 用下 gyx 學長的圖 切比雪夫距離 dis max delta x,delta y delta ...
松鼠搬家 切比雪夫距離 到 曼哈頓距離
題意 求切比雪夫距離 直接求不好求,可以轉化成曼哈頓距離 切比雪夫 d max x 1 x 2 y 1 y 2 曼哈頓距離 d x 1 x 2 y 1 y 2 d max x 1 x 2 y 1 y 2,x 1 x 2 y 2 y 1,x 2 x 1 y 1 y 2,x 2 x 1 y 2 y 1 ...