问题描述
所以我有一个 N 对象的数组,我想在这个数组中合并相同的值,同时跟踪每个值移动到的位置。例如,给定输入 ["a","b","a","c","b"]
,我想要输出 ["a","c"]
和移动列表 3->1
,4->3
,5->1
,6->2
.
我的输入是 m 对相同值的索引 (i,j) 的列表(总是按 i ≥ j)。我预计(与上面的玩具示例相反)m 通常会比 N 小得多;一个数量级可能是 N≈10^6 和 m≈10^2。看到这样的一对,我擦除位置 i 处的对象,将最后一个对象移动到位置 i,并将数组缩短一。这会处理数组,但不会处理簿记。
我可以通过使用 union-find 数据结构的变体来实现第二部分:即长度为 N 的向量 p,最初由恒等函数填充,并包含每个索引在 1,...,N 中的新位置。但是,这将具有空间复杂度 O(N)(并且由于初始填充而具有相同的时间复杂度),如果可能,我宁愿避免这种情况。
另一种可能性是使用字典来仅跟踪数组中移动的条目。然而,这本身是不够的:即,当将条目 i 移动到 j 时,我需要指向 j 而不仅仅是条目i 本身,以及之前指向 i 的任何其他条目 x。一个明显的解决方案是将指向它的所有条目的列表附加到 i ......但是事情变得有点复杂,我可能会错过一个更明显的解决方案。
由于这似乎是一个非常普遍的问题,因此文献中可能已经有解决方案。但是,我找不到正确的搜索词来找到它。是否已经存在某种数据结构执行此操作?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)