使用最少量的拼接将一个数组转换为另一个数组

时间:2013-03-21 09:50:41

标签: javascript algorithm math splice

我们来看一下这个数组

ar = [6,3,5,1,2]

我想将它转换为另一个数组,我可能只使用两个操作 - 在特定位置插入项目(splice(i,0,item))或从特定位置移除项目(splice(i,1))。我正在寻找使用最少数量的theese接头的解决方案。

第二个重要条件是我们考虑具有唯一值的数组,我们的数组不包含双精度数。

例如,

ar1 = [6,3,10,5,1,2];
ar2 = [6,3,1,2,5];

很明显,如果我们想从ar获得ar1,我们只需要一个拼接 - ar.splice(2,0,10)。如果我们想获得ar2,我们必须做两个拼接:ar.splice(2,1)然后push(5)(第二个等于拼接(ar.length,0,5))

顺便说一下,这项任务具有天然的实用价值。让我们想象一下,例如,产品列表和产品过滤器。我们分别更改过滤器的设置和列表更改。每一次变化都伴随着美丽的缓慢jquery向上滑动 - 向下滑动动画。此动画可能会向上滑动并隐藏特定项目或插入并向下滑动新项目。任务是缩小theese动画的数量。这意味着我们试图缩小列表中DOM操作的数量。

2 个答案:

答案 0 :(得分:2)

操作次数恰好是编辑距离(如果不允许替换)。查看levenshtein距离。

您可以修改算法以计算levenshtein距离,以实际输出所需的操作。

答案 1 :(得分:1)

我已经编写了希望解决问题的代码。此代码以某种方式基于Levenshtein距离概念。对于这个问题似乎非常有用,正如maniek的回答中提到的那样 为简单起见,我使用字符串代替数组并使用Python 对于由相同的整数组构成的两个相等长度的数组,原始问题似乎很容易减少到相同的问题。所以,我假设初始字符串和目标字符串具有相同的长度并由相同的字符集组成 Python代码:

import random
# Create random initial (strin) and target (strout) strings
s = "abcdefghijklmnopqrstuvwxyz"
l = list(s)
random.shuffle(l)
strout = ''.join(l)
random.shuffle(l)
strin = ''.join(l)

# Use it for tests
#strin = "63125798"
#strout = "63512897"

print strin, strout

ins_del = 0
for i in xrange(len(strin)-1, -1, -1):
    if strin[i] != strout[i]:
        if strin[i-1] == strout[i]:
            ii = strout.find(strin[i], 0, i)
            strin = strin[:ii] + strin[i] + strin[ii:i] + strin[i+1:]
            ins_del = ins_del + 1
            #Test output
            print "1:", strin
        else:
            ii = strin.find(strout[i], 0, i-1)
            strin = strin[:ii] + strin[ii+1:i+1] + strout[i] + strin[i+1:]
            ins_del = ins_del + 1
            #Test output
            print "2:", strin

print strin, strout

# Check the result
for i in xrange(0, len(strin)):
    if strin[i] != strout[i]:
        print "error in", i, "-th symbol"

print "Insert/Delite operations = ", ins_del

输出示例:

kewlciprdhfmovgyjbtazqusxn qjockmigphbuaztelwvfrsdnxy
2: kewlciprdhfmovgjbtazqusxny
1: kewlciprdhfmovgjbtazqusnxy
2: kewlciprhfmovgjbtazqusdnxy
2: kewlciphfmovgjbtazqursdnxy
2: kewlciphmovgjbtazqufrsdnxy
2: kewlciphmogjbtazquvfrsdnxy
2: kelciphmogjbtazquwvfrsdnxy
2: keciphmogjbtazqulwvfrsdnxy
2: kciphmogjbtazquelwvfrsdnxy
2: kciphmogjbazqutelwvfrsdnxy
2: kciphmogjbaquztelwvfrsdnxy
2: kciphmogjbquaztelwvfrsdnxy
1: qkciphmogjbuaztelwvfrsdnxy
2: qkcipmogjhbuaztelwvfrsdnxy
2: qkcimogjphbuaztelwvfrsdnxy
1: qjkcimogphbuaztelwvfrsdnxy
2: qjkcmoigphbuaztelwvfrsdnxy
1: qjokcmigphbuaztelwvfrsdnxy
1: qjockmigphbuaztelwvfrsdnxy
qjockmigphbuaztelwvfrsdnxy qjockmigphbuaztelwvfrsdnxy
Insert/Delite operations =  19