如何解决查找交换序列后每个节点占据的唯一位置的数量
一条线上有 N (N
例如,
在时间单位 1,位置 a1 和 b1 处的节点交换。
在时间单位 2,位置 a2 和 b2 处的节点交换。
…
在时间单位 M,位置 aM 和 bM 的节点交换。
在时间单位 M + 1,位置 a1 和 b1 处的节点交换。
在时间单位 M + 2,位置 a2 和 b2 处的节点交换。
等等……
对于每个节点,您需要确定它将占据的唯一位置的数量。
示例:
6 个节点,M = 4(序列由 4 个交换组成),K = 7(总时间单位为 7)。
顺序:
(1,2) (2,3) (3,4) (4,5)
模拟:
时间 0:{1、2、3、4、5、6}
时间 1:{2,1,3,4,5,6}
时间 2:{2,6}
时间 3:{2,6}
时间 4:{2,6}
时间 5:{3,2,6}
时间 6:{3,6}
时间 7:{3,6}
答案:
节点 1 到达位置 {1,5},所以是 5 个位置。
节点 2 到达位置 {1,4},所以是 4 个位置。
节点 3 到达位置 {1,3},所以 3 个位置。
节点 4 到达位置 {2,4},所以 3 个位置。
节点 5 到达位置 {3,5},所以是 3 个位置。
节点 6 没有移动,所以它到达了位置 {6},所以是 1 个位置。
解决此问题的一种方法是将节点视为图形。然后,您可以将每个交换视为连接,然后使用图形算法来计算您如何在节点之间移动。
我怎样才能成功地将图算法结合到这个问题中?
编辑:我花了几个小时思考这个问题,并希望将 Ehsan 的想法融入解决方案中。要找到每个位置的可能节点,您可以使用递归函数,例如 Ehsan 提出的函数 (F(F(...(F(original_order)))。然后,您可以对中的每个步骤执行此操作K. 但是,这将是一个 NK 解决方案,我的速度太慢了,因为我可以执行的最大操作数是 10^9。我该如何优化我当前的想法?
解决方法
您不需要图表。 他们的关键是减少 k
引理:假设在一系列步骤 {n1,n2,n3,...,nN}
之后,从原始节点列表 {s1,s2,.....,st}
到达新的节点顺序,例如 {n_i1,n_iN}
,并且每个节点都有一个唯一的访问列表作为 { {1}}
然后如果您再次执行相同的一系列步骤,您可以在上一步的帮助下在 {n1_v1,n1_vn1},{nN_v1,nN_vnN}
中找到新的节点顺序列表和唯一访问列表。
所以这是一种动态规划。
通过这种方法,您的算法的复杂性可能为 O(n)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。