迭代数组的笛卡尔积中的点,按距点的出租车距离排序[关闭]

问题描述 投票:0回答:1

我有一个整数数组的数组 - 例如:

[
    [11, 9, 13, 7, 15, 6, 16, 4, 18, 2, 20, 0, 22],
    [4, 3, 10, 2, 6, 1, 7, 0, 8],
    [9, 7, 11, 6, 12, 5, 13,  4, 14, 2, 16, 17, 0]
]

我想迭代数组的笛卡尔积中的所有点,按距每个数组中第一个元素组成的点的出租车距离排序。因此,在本例中,我想迭代所有不同的三元组,其第一、第二和第三个元素分别属于输入中的第一个、第二个和第三个数组,从元组开始

(11, 4, 9)
,并按照出租车距
(11, 4, 9)
的距离升序排列。

因此,对于上面的示例输入...

  • 结果中有 1521 个元素(因为三个数组的长度分别为 13、9、13,且 13×9×13=1521)
  • 结果的第一个元素将是
    (11, 4, 9)
  • 第二个元素是
    (11, 3, 9)
    - 输入的笛卡尔积中与
    (11, 4, 9)
  • 距离恰好为 1 的点
  • 接下来的六个元素将是
    (9, 4, 9)
    (13, 4, 9)
    (11, 2, 9)
    (11, 6, 9)
    (11, 4, 7)
    (11, 4, 11)
    ,顺序任意。 (所有这些与
    (11, 4, 9)
    的距离都是 2。)
  • 第 1521 个也是最后一个元素将是
    (22, 10, 0)
    - 距离
    (11, 4, 9)
  • 最远的点

执行此操作的最简单算法是生成笛卡尔积中所有点的数组(在示例中为 1521 个点),然后按距第一个点的绝对距离对它们进行排序,然后迭代结果。但对于较大的输入,这在内存方面将非常低效。我不想一次将所有点存储在内存中;我只需要迭代它们一次。

我怎样才能以更节省内存的方式实现这一点?

arrays algorithm
1个回答
-1
投票

首先,按照与相应第一个元素的绝对差的顺序对每个输入数组进行排序。

在此转换之后,如果将每个输出表示为元组

(i,j,k)
,则第一个输出为
(0,0,0)
,之后的每个输出都可以通过获取一些前面的输出并递增
i
j
k
减一。

要按顺序获得输出:

  1. (0,0,0)
    放入按距离排序的优先级队列中,并放入一个会记住您已添加到队列中的元组的集合中
  2. 当优先级队列不为空时:
    1. 取出一个元素并记录输出。
    2. 通过递增
      i
      j
      k
      生成 3 个新元组。
    3. 对于每个不超出输入数组边界且不存在于集合中的元素,将其添加到集合和优先级队列中。
© www.soinside.com 2019 - 2024. All rights reserved.