我有一个整数数组的数组 - 例如:
[
[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)
的距离升序排列。
因此,对于上面的示例输入...
(11, 4, 9)
(11, 3, 9)
- 输入的笛卡尔积中与 (11, 4, 9)
(9, 4, 9)
、(13, 4, 9)
、(11, 2, 9)
、(11, 6, 9)
、(11, 4, 7)
、(11, 4, 11)
,顺序任意。 (所有这些与 (11, 4, 9)
的距离都是 2。)(22, 10, 0)
- 距离 (11, 4, 9)
执行此操作的最简单算法是生成笛卡尔积中所有点的数组(在示例中为 1521 个点),然后按距第一个点的绝对距离对它们进行排序,然后迭代结果。但对于较大的输入,这在内存方面将非常低效。我不想一次将所有点存储在内存中;我只需要迭代它们一次。
我怎样才能以更节省内存的方式实现这一点?
首先,按照与相应第一个元素的绝对差的顺序对每个输入数组进行排序。
在此转换之后,如果将每个输出表示为元组
(i,j,k)
,则第一个输出为 (0,0,0)
,之后的每个输出都可以通过获取一些前面的输出并递增 i
、j
或k
减一。
要按顺序获得输出:
(0,0,0)
放入按距离排序的优先级队列中,并放入一个会记住您已添加到队列中的元组的集合中i
、j
和 k
生成 3 个新元组。