Matlab:删除矩阵的冗余“移位”条目

时间:2011-12-11 11:51:36

标签: algorithm matlab shift traveling-salesman

我有一个问题需要解决,但我想不出任何简单而重要的问题:快速解决方案。这有点像多旅行推销员问题的一部分。

首先我有一个包含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行和MM < 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 = 10M = 6

1 个答案:

答案 0 :(得分:1)

对于常数M,N,可以通过按顺序对复合记录进行排序,然后测试相邻条目的相等性,在时间O(X log X)中求解。

“复合记录”是指将行的功能及其断点合并为单个记录的记录。对于给定的行,通过以下方式获得该函数:

  1. 将断点应用于行,获取部分路径列表。
  2. 按每条路线的第一个元素将部分路线按升序排序。 例如排序{[4],[3],[1 2],[5]}为{[1 2],[3],[4],[5]}。
  3. 通过连接已排序的部分路由来形成新的复合记录;有效的断点;和索引到源行。 例如如果上一步中的示例行是第2行=(4 3 1 2 5),则保存(1 2 3 4 5; 2 3 4; 2)这是(已排序的部分路径;有效断点) ; index)。
  4. 对复合记录进行排序后,查看相邻条目的相等性,直至源索引。例如,(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因子,并在发生重复哈希条目时将记录标记为删除。