我有一个问题需要解决,但我想不出任何简单而重要的问题:快速解决方案。这有点像多旅行推销员问题的一部分。
首先我有一个包含X
行和N
列的矩阵,N
是我的算法的静态变量,X
可以变化。我们假设它看起来像(N = 5
}:
matrix = [1 2 4 3 5; 4 3 1 2 5; 1 2 4 3 5; ]
matrix =
1 2 4 3 5
4 3 1 2 5
1 2 4 3 5
每一行都被视为“路线”,并包含1和N
之间的所有唯一数字。每条路线(=行)将在部分路线中分割。这意味着,我有一个断点矩阵,其中包含X
行和M
(M < N
)列。 E.g:
breakpoints = [2 3 4; 1 2 4; 1 3 4]
breakpoints =
2 3 4
1 2 4
1 3 4
breakpoints
的每一行的索引给出了matrix
AFTER的相应行的元素,其中路由将被分成部分路径。为了说清楚,让我们以frist行为例:breakpoints(1, :) = 2 3 4
这意味着路由matrix(1, :) = 1 2 4 3 5
将被拆分为部分路由[1 2], [4], [3] and [5]
。第二行有断点breakpoints(2, :) = 1 2 4
,它将第二条路线matrix(2, :) = 4 3 1 2 5
拆分为部分路线[4], [3], [1 2] and [5]
。
现在我的目标是从matrix
删除所有行,而部分路由是冗余重复,只是以不同的顺序。在此示例中,第2行是第1行的副本。第3行即使与第1行具有相同的路由也不重复,因为存在导致部分路由[1], [2 4], [3] and [5]
的不同断点。
我怎么能干净又快速地做到这一点? Matrix可以包含许多元素,例如X = 5e4
行和N = 10
,M = 6
。
答案 0 :(得分:1)
对于常数M,N,可以通过按顺序对复合记录进行排序,然后测试相邻条目的相等性,在时间O(X log X)中求解。
“复合记录”是指将行的功能及其断点合并为单个记录的记录。对于给定的行,通过以下方式获得该函数:
对复合记录进行排序后,查看相邻条目的相等性,直至源索引。例如,(1 2 3 4 5; 2 3 4; 2)和(1 2 3 4 5; 2 3 4; 7)表示第7行的部分路由与第2行的部分路由重复。每次找到重复时,将其对应的原始第一行条目设置为无效的点编号,例如N + 1。
因此,在排序后,花费O(X log X),使用O(X)时间来检测重复。然后使用O(X)时间通过原始行删除具有无效第一个元素的行来挤出重复项。
稍微更精确的总成本是O((M + N)* X * log X),其超过理论最小值O((M + N)* X)log X因子。如果将复合记录存储在哈希表中而不是对它们进行排序,则可以删除日志X因子,并在发生重复哈希条目时将记录标记为删除。