曼哈顿距离
曼哈顿距离,又称为城市街区距离或L1距离,是两点在南北方向和东西方向上的距离之和。
对于二维平面上的两个点A(x1, y1)和B(x2, y2),它们的曼哈顿距离可以表示为: d = |x1 - x2| + |y1 - y2|。其中,|a|表示a的绝对值。
曼哈顿距离在计算机科学和机器学习中经常被用于衡量两个点之间的距离,特别适用于在一个离散的网格中计算两个点的距离,例如在图像处理、路径规划等领域。
与欧几里得距离相比,曼哈顿距离更加符合实际情况,因为它只考虑了水平和垂直方向上的移动,而不考虑对角线方向上的移动。
除此之外,曼哈顿距离在计算机科学和机器学习中有多种应用,例如:
- 路径规划:在网格地图或城市街道网络中,曼哈顿距离可以用来评估两点之间的最短路径,特别适用于只能沿水平和垂直方向移动的情况。
- 图像处理:在图像处理中,曼哈顿距离可以用来计算两个像素之间的差异。例如,可以使用曼哈顿距离来度量两个图像的相似性,或者评估图像中不同区域的差异程度。
- 特征选择:在特征选择的过程中,曼哈顿距离可以用来度量特征之间的相关性或相似性,从而帮助选择最具有代表性的特征。
- 聚类分析:在聚类分析中,曼哈顿距离可以用来度量样本之间的相似性或距离,从而将样本分成不同的簇。曼哈顿距离可以作为一种度量距离的方式,用于聚类算法,例如K-means算法。
- 约束求解:在求解约束问题时,曼哈顿距离可以被用来定义约束条件或者度量解的可行性。例如,在车辆路径规划中,曼哈顿距离可以用来限制车辆的行驶距离。
总的来说,曼哈顿距离在各种领域中都有广泛的应用,特别适用于离散的网格结构或只能进行水平和垂直移动的情况。它可以帮助我们度量和比较两个点之间的距离,从而解决各种问题。
画菱形代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int n;
cin >> n;
int cx = n / 2, cy = n / 2;
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
if (abs(i - cx) + abs(j - cy) <= n / 2) cout << '*';
else cout << ' ';
cout << endl;
}
return 0;
}
画一个空心菱形
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int n;
cin >> n;
int cx = n / 2, cy = n / 2
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
if (abs(i - cx) + abs(j - cy) == n / 2) cout << '*';
else cout << ' ';
cout << endl;
}
return 0;
}