查找交换序列后每个节点占用的唯一位置数

Finding the number of unique positions occupied by every node after sequence of swaps

提问人:cracra 提问时间:1/24/2021 最后编辑:cracra 更新时间:1/25/2021 访问量:210

问:

一条线上有 N (N <= 50000) 个节点,节点 i 位于该线上的位置 i。你得到一个 M 个不同的掉期序列 (M <= 20000),它写在 from (a1, b1) (a2, b2) ....(aM、bM)。在每个单位时间内,i = 1...M,位置 ai 和 bi swap 的节点。然后,相同的 M 交换在 M + 1....2M 分钟内再次发生,然后是 2M + 1...3M,依此类推,继续以 K 个时间单位 (K < 10^18) 的循环方式。

举个例子,

在时间单位 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, 3, 1, 4, 5, 6}

时间 3:{2、3、4、1、5、6}

时间 4:{2, 3, 4, 5, 1, 6}

时间 5:{3, 2, 4, 5, 1, 6}

时间 6:{3、4、2、5、1、6}

时间 7:{3、4、5、2、1、6}

答:

节点 1 到达位置 {1, 2, 3, 4, 5},即 5 个位置。

节点 2 到达位置 {1, 2, 3, 4},即 4 个位置。

节点 3 到达位置 {1, 2, 3},因此为 3 个位置。

节点 4 到达位置 {2, 3, 4},因此为 3 个位置。

节点 5 到达位置 {3, 4, 5},因此有 3 个位置。

节点 6 不移动,因此它到达位置 {6},因此到达 1 个位置。

解决此问题的一种方法是将节点视为图形。然后,您可以将每个交换视为连接,然后使用图形算法来计算节点之间的移动方式。

如何成功地将图算法合并到这个问题中?

编辑:我又花了几个小时思考这个问题,并希望将Ehsan的想法纳入解决方案中。要找到每个位置的可能节点,您可以使用递归函数,就像 Ehsan 提出的函数一样 (F(F(...(F(original_order)))。然后,您可以对 K 中的每一步执行此操作。但是,这将是一个 NK 解决方案,我太慢了,因为我可以执行的最大操作数是 10^9。我怎样才能优化我当前的想法?

数组 算法 优化 语言不可知

评论

0赞 cracra 1/24/2021
原版没有我解决它的方法,因为它太模糊了而被关闭。
0赞 גלעד ברקן 1/24/2021
你所描述的你目前的“方法”似乎并没有提供比你在这里提供的更多的实质内容:https://stackoverflow.com/questions/65862705/number-of-distinct-positions-occupied-by-each-node-when-undergoing-sequence-of-s。请付出一些努力。投票结束。
1赞 cracra 1/25/2021
理解。我在我的帖子中添加了另一个更发达的想法。

答:

0赞 Ehsan Gerayli 1/24/2021 #1

你不需要图表。 他们的关键点是减少k

引理:假设在一系列步骤之后,从原始节点列表到新的节点顺序,例如,并且每个节点都有一个唯一的访问列表,作为{n1,n2,n3,...,nN}{s1,s2,.....,st}{n_i1,...,n_iN}{n1_v1,...,n1_vn1},...,{nN_v1,...,nN_vnN}

然后,如果您再次执行相同的系列步骤,则可以在上一步的帮助下找到新的节点顺序列表以及唯一访问列表。 所以这是一种动态编程。 通过这种方法,算法的复杂性可能为O(n)O(n*log(k/m)+m)

评论

0赞 Abhinav Mathur 1/24/2021
你能更好地解释一下吗?
0赞 Ehsan Gerayli 1/24/2021
对于步骤系列,考虑一个转换为 {n_i1,...,n_iN}' 的函数,因此,如果我们再次执行这些步骤,我们可以在 .例如,如果原始序列是并且它变成了,那么如果我们再次执行这些步骤,它肯定会转到 。换句话说,有一个函数每次都以相同的方式旋转索引,只是输入顺序随时间变化。这就像{s1,...,st}{n1,...,nN}O(n){1,2,3}{3,1,2}{2,3,1}FF(F(...(F(original_order)))
0赞 cracra 1/24/2021
你能用示例案例在你的帖子中运行算法吗?我想那时我会更清楚地理解它。
0赞 Abhinav Mathur 1/24/2021
@EhsanGerayli那么,这如何解决问题呢?
0赞 גלעד ברקן 1/24/2021
请解释一下你对时间复杂度的评估。我不明白我们如何获得 K 的对数因子。