我正在寻找一种能够在给定有序元素列表和无序元素列表的情况下查找/分配顺序和重叠的算法。 (其中可能存在或可能不存在重叠)。
对于这个例子,我将使用整数,但它们也可以是人名,ID代码等.IE数量不能用于解决实际问题,但有助于解释我使用有序集的问题(1,2,3,4,5,6,7,8,9,10)作为圣杯回答。
输入:
有序清单:(1,2,3,4),(8,9,10),(3,4,5)
UnOrdered List of Lists:(3,4,2),(6,4,5,7),(10,9)
关于如何在脑海中执行此算法的思考过程:
输出:
有没有人知道我可以使用的类似问题或算法?理想情况下,它将在Perl中,但伪代码或来自另一种语言的算法会很好。
由于
答案 0 :(得分:0)
如果我理解这一点,您需要一组有序和无序列表中的一个有序列表。一种可能的解决方案是迭代所有集合中的所有值,并将它们添加到散列表结构中。在实现术语中,可以是c ++ map,java hashmap,python dictionary等。这看起来像:
for i over all S //(Ordered and 无序的)
for j over all values in S[i] H.insert(S[i][j]) //H is the hash table
现在遍历哈希表条目以获取所需的有序列表。这是非常实用和最佳的。
一个不那么实用的解决方案,但值得一提的是它的好处是:
为每个唯一编号分配相应的素数。例如,在您的示例中,将数字映射如下: p [1] = 2,p [2] = 3,p [3] = 5,p [4] = 7,p [5] = 11,p [6] = 13,p [7] = 17,p [8] = 19,p [9] = 23,p [10] = 29;
现在,每个集合Si可以用值Vi-相应素数的乘积来表示。因此,一组Si =(1,2,3)(或对于那个问题(2,1,3))将具有值Vi = p [1] * p [2] * p [3]
找到所有Vi的LCM。叫这个V. V =适用于所有i LCM {Vi}
将因子V分解为其主要因素。每个素数代表最终有序列表中的元素。
这第二个解决方案很整洁,但出于实际目的而分解,因为我们很快进入了bignum空间。
希望至少其中一项适合你!