【问题标题】:Flatten jagged array by link of values通过值的链接展平锯齿状数组
【发布时间】:2016-10-19 08:39:10
【问题描述】:

给定一个锯齿状的整数数组,例如:

var arr = new int[11][] {
    new int[] { 0, 7 },
    new int[] { 1 },
    new int[] { 2, 5, 6 },
    new int[] { 3 },
    new int[] { 4 },
    new int[] { 5, 6 },
    new int[] { 6 },
    new int[] { 7, 9 },
    new int[] { 8, 10 },
    new int[] { 9 },
    new int[] { 10 }
};

如何有效地展平以生成一个一维数组,其中包含项目的位置顺序以及它们的值之间的链接。上述数组的输出应该是:

{ 0, 7, 9, 1, 2, 5, 6, 3, 4, 8, 10 }

在此特定示例中,{ 0, 7 }{ 7, 9 } 将组合在一起,因为它们有一个共同的数字,7 链接它们。此外,删除了 { 5, 6 }{ 6 } 等以下重复项。

不确定它是否足够有意义,但我也在摸不着头脑:) 我希望可以避免过多的反向引用和几个嵌套循环,如果可能的话,可能使用 LINQ/PLINQ 或一些智能就地字符串操作。

【问题讨论】:

  • 如果数组中存在{ 0, 7 }{ 7, 9 }{ 7, 10 }怎么办?
  • 您对此有没有效率不高的算法?
  • 这个问题没有很好的定义。有太多的情况完全不明显应该发生什么。在您的示例中,您似乎暗示可以随意重新排列子阵列以产生“更短”的结果。如果有多种重新排列方式怎么办?应该选哪一个?如果某些安排产生的结果比其他安排短怎么办?

标签: c# arrays algorithm


【解决方案1】:

您的示例结果可能是 DAG(有向无环图)的 topological sorting 的结果,其中您的子数组对形成图边

{2,5,6} 形成有向边(弧)2->5 和 5->6。

拓扑排序还会发现可能的矛盾(循环),例如 {2,3}、{3,5}、{5,2}

【讨论】:

  • 感谢拓扑排序的建议。这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2015-12-11
  • 2018-05-29
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2014-01-01
  • 2011-01-28
相关资源
最近更新 更多