几个场景
思考这样的场景:
- 场景一:我们拥有北京时所有商场的位置坐标,现在我们想知道整个北京市哪里商场最多
2. 场景二:在第一个场景的基础上,我们想知道北京各块区域的繁华程度
想解决场景一的问题,我们要对北京进行划分,划分方式也比较多:比如按照行政区、按照商圈、按照n*n的tile划分。接着求每个区域的商场数量,然后商场数量最多的区域就可以。
初步求解
把北京分块
考虑到我们没有北京时范围的坐标,所以不能直接把北京市分块,而又没有北京市商圈、行政区的坐标范围。我们只能找出包含所有已知坐标的最小矩形,也就是取矩形做顶点(Xmin,Ymax)以及矩形右顶点(Xmax,Ymin),这里先假设坐标都是正数,大概思路如下
points := make(Point,0)
minX, minY, maxX, maxY := 0, 0, 0, 0
for _, v := range points {
if minX == 0 || v.X < minX {
minX = v.X
}
if minY == 0 || v.Y < minY {
minY = v.Y
}
if v.X > maxX {
maxX = v.X
}
if v.Y > maxY {
maxY = v.Y
}
}
有个最小矩形后,我们就可以把最小矩形分成小正方形,来达成对北京模拟分块的目的,划分后其实后形成一个i*i矩阵,思路如下:
const tileCount = 10
matrix := make([][]int, tileCount)
for _, v := range matrix {
v = make([]int, tileCount)
}
tileXInterval := float((maxX - minX) / tileCount)
tileYInterval := float((maxY- minY) / tileCount)
注意为了保证精度,上面interval用了float类型。于是矩阵坐标(m,n)的中心点坐标就是:
(Xn,Ym) = (minX + tileXInterval * n + tileXInterval / 2, minY + tileYInterval * m + tileYInterval / 2)
求每小块中样本个数
把每个样本放入指定的小块中就是算每个样本数据在i*i矩阵中的坐标。然后对矩阵每小块进行统计
for _, point := range points