Algorithm 如何比较两条路径

Algorithm 如何比较两条路径,algorithm,data-structures,set,swap,Algorithm,Data Structures,Set,Swap,我的数据结构是一个由城市列表表示的路径。例如,如果城市 A, B, C, D 可能的配置可以是:A、B、D、C或D、C、A、B 我需要两个比较两条路径,以便找到这两条路径之间的差异,以这样的方式,此过程的输出返回将第二条路径转换为第一条路径所需的交换操作集 例如,给定以下路径: X = {A, B, D, C} Y = {D, C, A, B} indexes = {0, 1, 2, 3} 将路径Y转换为X的一种可能方法是以下交换:{0-2,1-3} {D, C, A, B} -->

我的数据结构是一个由城市列表表示的路径。例如,如果城市

A, B, C, D
可能的配置可以是:
A、B、D、C
D、C、A、B

我需要两个比较两条路径,以便找到这两条路径之间的差异,以这样的方式,此过程的输出返回将第二条路径转换为第一条路径所需的交换操作集

例如,给定以下路径:

X = {A, B, D, C}
Y = {D, C, A, B}
indexes = {0, 1, 2, 3}
将路径
Y
转换为
X
的一种可能方法是以下交换:
{0-2,1-3}

{D, C, A, B} --> [0-2] --> {A, C, D, B} --> [1-3] --> {A, B, D, C}

是否有任何已知(且快速)的算法可以计算此集合?

您的问题看起来像是计算将一个置换转换为另一个置换的最小交换数的问题

事实上,这是一个众所周知的问题。关键思想是创建新的排列
P
,这样
P[i]
就是
X[i]
城市在
Y
中的索引。然后,您只需计算
P
C
的循环总数。答案是
len(X)-C
,其中
len(X)
X
的大小

在您的情况下,
p
看起来像:
3,4,1,2
。它有两个循环:
3,1
4,2
。所以答案是
4-2=2

总的复杂性是线性的

有关更多详细信息,请参阅。它更详细地解释了这个算法

编辑

好吧,但我们如何才能得到互换,而不仅仅是它们的数量?注意,在这个解决方案中,如果周期长度为
N
,我们将独立地对每个周期重新排序,进行
N-1
交换。所以,如果你有循环
v(0),v(1),…,v(N-1),v(N)
你只需要交换
v(N),v(N-1)
v(N-1),v(N-2)
,…,
v(1),v(0)
。因此,可以按相反的顺序交换循环元素


此外,如果有长度为
L(1),L(2),…,L(C)
C
周期,则交换的数量为
L(1)-1+L(2)-1+…+L(C)-1=L(1)+L(2)+…+L(C)-C=LEN-C
其中
LEN
是排列的长度

这条路有多长?BFS(或A*搜索算法)可以,但需要指数时间。@amit数量级为2,因此少于1000个元素。如果结果存在,则可以求解(快速)使用带有自定义键函数的排序算法。@SashaMN最好定义此算法或显示example@SashaMN您的第二种方法是一种众所周知的排序算法,它不返回我需要的交换操作。我认为,不仅交换操作的数量,而且交换操作本身应该是结果?我怀疑,这在线性时间复杂度中是可能的。@Ctx算法很简单,如果你理解的话,你需要精确的N-1交换来转换一个长度为N的循环。@SashaMN如果它很简单,那么请用实际算法来回答最坏情况下时间复杂度为O(N)的OPs问题。我怀疑你(确实是任何人)会成功。@Edgarokyan我仍然不明白这在O(n)中应该如何工作。即使第一步(P[i]是Y中X[i]城市的指数)在O(n)中也不可行。或者您将如何实现这一点?您可以迭代
Y
并设置
Y[i]
T[Y[i]]=i
。然后迭代
X
并设置
P[i]=T[X[i]]
。像这样的。你可以用任何合适的方式来采用它。