【发布时间】:2019-02-15 08:02:43
【问题描述】:
我正在制作一个应用程序,其中洗牌数组是主要组件之一。数组包含的内容并不真正相关,但为简单起见,我在下面的示例代码中使用了单个字符。在大多数情况下,该数组将包含 1-3000 个元素,但可能更多。
Array a 表示数组的原始状态,array b 是我希望数组处于的最终状态。b 的状态可以使用任意数量的转换来进行,但在洗牌之后我想找到将数组a 转换为与数组b 相同的状态所需完成的最小转换集。
但是,可以进行的转换有一些限制。我将使用一个 API 对数组进行洗牌,这就是为什么我想找到所需的最小(或接近)转换数量,以最小化请求数量。
只能通过选择要移动的元素的start 索引、一次要移动多少个连续元素的range 以及要放置的索引来完成转换范围before。可以对转换列表进行排序,以便每个转换都使用之前的结果,或者它们都可以使用a 的原始状态作为基础。
一些示例伪javascript代码:
const a = ['a', 'b', 'c', 'd', 'e']
const b = ['d', 'c', 'a', 'b', 'e']
const getTransformations = (a, b) => {
// ...
return [
{start: 0, range: 2, before: 4},
{start: 0, range: 1, before: 2}
]
}
因为我将使用不同的混洗算法,我更愿意使用数组的原始状态和最终状态来计算转换,但如果有其他更有效的解决方案需要稍微不同的输入即可也是。
我真正感兴趣的是知道这是否是一个可以在合理的时间内解决的问题,以及是否有任何算法可以帮助我做到这一点。
【问题讨论】:
-
您可能对这个related post 感兴趣。
-
数组可以包含不可区分的重复项吗?
-
@גלעדברקן 您可以假设所有元素都是可区分的
-
@AxelKemper 这个帖子看起来很有前途!
标签: arrays algorithm transformation shuffle