【问题标题】:Convert set of Coordinates into a sorted 2D Array将一组坐标转换为已排序的二维数组
【发布时间】:2021-06-28 11:28:09
【问题描述】:

假设我有一组 n 个坐标 (x, y) 例如 (123, 41), (123, 50), (555, 10), (600, 10)

我想把它转换成一个二维数组,其中:

  • 列数等于x坐标的唯一个数

  • 行数等于y坐标的唯一个数

  • 没有两组坐标完全相同,并且 x 和 y 的值可以是什么也没有限制。

  • 一个坐标被放置在相对于所有其他坐标的 x 和 y 的索引处。例如。 (555,10) 具有第二大的 x 坐标 (x=1) 和最小的 y 坐标之一 (y=0),因此它的位置将是 [1][0]

    x=0 x=1 x=2
    y=0 null (555, 10) (600, 10)
    y=1 (123, 41) null null
    y=2 (123, 50) null null

(有 3 个唯一的 x 坐标(123、555、666)和 3 个唯一的 y 坐标(41、50、10)所以数组是 3x3)

如上所述,我可以使用什么算法从一组坐标生成二维数组?我尝试创建自己的,但是当 n 非常大 O(n^2) 时它非常慢。

【问题讨论】:

  • 请说明问题的限制条件。 最多可以给多少分?如果(x, y) 是任何有效坐标,那么xy 可以有多大? xy 是否总是小于 n 其中 n 是要输入的点数?
  • @AKSingh 编辑感谢。
  • 您应该将n 的范围表示为1 n x 也将小于n 就像1 x

标签: algorithm sorting multidimensional-array coordinates


【解决方案1】:

这是一个简单的解决方案:

  1. 获取所有不同的xy 坐标并对它们进行排序。
  2. 对于每个点,获取其在各自排序数组中的xy 坐标的位置。将点放在结果数组中的这个位置。

类似这样的东西(在 Python 中):

# cook your dish here
points = [(123, 41), (123, 50), (555, 10), (600, 10)]
x_coords = sorted(list(set(i[0] for i in points))) # all distinct x coordinates
y_coords = sorted(list(set(i[1] for i in points))) # all distinct y coordinates
result = [[0 for i in range(len(x_coords))] for j in range(len(y_coords))]

for i in points:
    x_final = x_coords.index(i[0])
    y_final = y_coords.index(i[1])
    result[y_final][x_final] = i
    
for i in result:
    print(i)

这给出了:

[0, (555, 10), (600, 10)]
[(123, 41), 0, 0]
[(123, 50), 0, 0]
  1. 您可以根据自己的方便将零替换为Nonenull
  2. 此方法的时间复杂度为O(NlogN)

编辑index() 方法可能不是最有效的方法,具体取决于所使用的语言/数据结构。你可以使用二分搜索来实现。

【讨论】:

  • 要提供 O(NlogN),应该使用二分查找而不是 x_coords.index
  • @MBo 是的,我知道。也将其添加到答案中
猜你喜欢
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2018-02-19
相关资源
最近更新 更多