【问题标题】:list of lists with random number of elements each, how to align same elements in the same column?每个具有随机数量元素的列表列表,如何对齐同一列中的相同元素?
【发布时间】:2014-02-07 08:16:01
【问题描述】:

如果您有一个列表列表,其中每个列表具有随机数量的随机元素,您将如何创建一个矩阵以使相同的元素出现在同一列中?

每一行至少有一个元素/列,但不同的行可以有不同数量的元素/列。每个元素每行最多出现一次。

元素不必保留其原始列,但应在结果矩阵中与其原始列保持最小距离。

在输入中出现在元素 y 之前的每个元素 x 也必须在输出中出现在 y 之前。

例如:

a|c
a|b|c
c|e
a|d|e
b|d

之后应该是这样的:

a| |c| | 
a|b|c| | 
 | |c| |e
a| | |d|e
 |b| |d|

这只是一个简单的例子,任何正数的列和每列正数的元素都应该被覆盖。

什么是有效的算法?

【问题讨论】:

    标签: algorithm language-agnostic


    【解决方案1】:

    浏览一次数据,构建一个图,其中每个元素都是一个节点,并且每个元素与直接出现在该元素之后的元素之间应该有一条有向边。

    然后做一个topological sort的图:

    有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点 u 到顶点 v 的每条有向边 uv,u 在排序中位于 v 之前。例如,图的顶点可能代表要执行的任务,而边可能代表一个任务必须在另一个任务之前执行的约束;在此应用程序中,拓扑排序只是任务的有效序列。

    这将返回一个有序的元素列表,该列表将对应于元素到列中的顺序。

    【讨论】:

    • 谢谢,这是否可以最大限度地减少与元素之间原始距离的偏差?
    • 这主要是为了保持元素的顺序(如果a|b出现在输入中,b总是出现在输出中a之后),假设这实际上是可能的,所以这个可能不完全是你所追求的。我可能错过了“最小距离”的要求,尽管我也不完全确定你在说什么距离——尽管人们肯定能够以最小化这个距离的方式进行拓扑排序。跨度>
    • 其实我理解你试图最小化与原始列的距离的意思,但这可能与拓扑排序的结果冲突,即如果a|b出现在输入中,则最小化距离可能涉及将b 放在a 之前,这与拓扑排序冲突,拓扑排序总是将a 放在b 之前。所以不,它并没有真正努力最小化该距离(它可能一般给出一个很好的距离,但肯定会有例外)。
    • 我的意思是最小化距离,同时仍然遵守所有其他约束,因为看起来仍然可能存在不同的距离。
    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2019-07-30
    • 2020-12-03
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多