假设有一个整数数组(例如为[1 5 3 4 6])。元素根据以下规则重新排列。每个元素都可以向前跳跃(向左),并在跳过的索引中滑动元素。该过程以第二索引中的元素开始(即5)。它有跳过元素1的选择,或者它可以保持在它自己的位置。如果它选择跳跃,则元素1向下滑动到索引2.让我们假设它选择跳跃,然后我们的结果数组将会是[5 1 3 4 6]。元素3现在可以跳过1或2个位置并重复该过程。如果在一个位置上跳跃3次,阵列现在是[5 3 1 4 6],并且如果跳过两个位置,现在将是[3 5 1 4 6]。给定一个源和阵列天线的最终,发现跳数在不到二次时间复杂度生成从源最终
这是很容易证明的元素的所有可能的排列是可以以这种方式。任何最终配置都可以通过一组独特的事件来达成。
的问题是,给定一个最终阵列和源阵列,发现在来自光源的阵列天线的最终到达所需要的跳的总数。 O(N^2)实现很容易找到,但我相信这可以在O(N)或O(NlogN)中完成。另外,如果不可能比O(N2)做得更好,那么知道这一点将是非常好的。
例如,如果最后一个数组为[3,5,1,4,6]和源阵列[1,5,3,4,6],答案将是3.
我ö (N2)算法是这样的:你从源头数组的所有位置循环遍历,因为我们知道这是最后一个要移动的元素。这里是6,我们检查它在最终数组中的位置。我们计算所需跳数,并需要重新排列最终数组,以将该元素放置在源数组中的原始位置。重新排列步骤遍历数组中的所有元素,并且该过程遍历所有元素,因此O(N^2)。使用散列图或地图可以帮助搜索,但是在每个产生O(N^2)的步骤之后需要更新地图。
P.S.我试图用贝叶斯方式来模拟两个排列之间的相关性,这是一个小问题。任何关于修改生成过程以使问题更简单的想法也是有帮助的。
编辑:我发现我的答案。这正是Kendall Tau距离所做的。有一种简单的基于合并排序的算法可以在O(NlogN)中找到它。
什么是你的O(N^2)算法? – v78
为什么“答案会是3”?这里有2跳 - 第一跳3跳,第二跳5跳。另外,我们可以假设数组中的整数是唯一的还是不是? –
@AlexanderAnikin你只能向左跳,而不能跳到右侧。 3在最左边的位置,所以它没有任何有效的跳跃。 5跳与3交换位置,给出[5,3,1,4,6],当前跳数为1.然后元素1向左跳两个位置,使当前数组[1,5,3,4 ,6]。 4和6已经在他们想要的位置。所以跳数的总数是3. –