让我在解决问题之前解释一些定义:
说点A是坐标(可能有双倍值),比如说(1.2,3.5,4.3,2.6), 与B点相同。
A点占据B点, 当且仅当 1.点A中的所有坐标< = B点中的所有坐标,和 2.点A的一个坐标<相应的B点坐标
例如: 给定
A=(2,3,4,5)
B=(2,3,4,6)
由于条件1成立,因此A占优势B,而对于条件2,A 的第四成分占优势。 B的第四部分。
再举一个例子,
A=(2,3,4,5)
B=(2,3,4,5)
A都不支配B,反之亦然,因为条件2在两种情况下都不成立。
现在给出n维坐标列表,我希望找到不受其他人支配的坐标集, 这些坐标被称为天际线集。
假设我有5维坐标
(2,1,2,1,2)
(1,2,1,2,1)
(3,3,3,3,3)
(4,4,4,4,4)
天际线集是
(2,1,2,1,2)
(1,2,1,2,1)
现在我想写一个函数:
List<double[]> SkylineSet(List<double[]> Coordinates, int dimension)
给出示例输入:
List<double[]> newList=new List<double[]>();
newList.Add(new double[] {2, 1, 2, 1, 2});
newList.Add(new double[] { 1, 2, 1, 2, 1 });
newList.Add(new double[] { 3, 3, 3, 3, 3 });
newList.Add(new double[] { 4, 4, 4, 4, 4 });
SkylineSet(newList,5)
将输出
(2,1,2,1,2)
(1,2,1,2,1)
这可以通过每个坐标的成对比较来实现,但是 坐标的数量可以非常大,任何人都知道如何有效地解决这个问题?
答案 0 :(得分:1)
将点放在K-D树(或某些此类数据结构)中。现在,您可以有效地找到由给定点支配的点。删除那些占主导地位的人,重复所有剩余的分数。
答案 1 :(得分:0)
我不确定这是否有用。这似乎在我脑海里似乎是合理的。也许这正是你正在做的事情。
建立一个支配矩阵NxN,其中N是点数。矩阵中的值是“相等”,“支配”,“支配”,“不”。将所有矩阵单元格设置为“相等”。该矩阵将结果保存在算法的末尾。
从第一个坐标开始。
我在这里假设我们有一个数组,其中包含当前坐标的所有值,但也与它们相关的点有关。
建立部分统治关系,仅查看当前坐标。统治的关系可以有一个这样的价值:“平等”,“支配”,“支配”。没有“既不”。
在双嵌套循环中运行此数组(I = 0,N-2; J = I + 1,N-1)。给定两个点的关系R和这两个点的关系矩阵中的单元格C将矩阵更新为新值C,如下所示:
如果C“相等”则C = R. 如果C“既不”,则不变 如果C被“支配”而R是“支配”则C变为“不”,否则不变 如果C是“支配”而R是“支配”则C变为“不”,否则不变。
对所有坐标重复此过程,在矩阵中累积结果。
最后贯穿每个点的矩阵。将所有与任何其他点没有“支配”关系的点。