問題は、2つの指定された文字列のすべての可能なインターリーブを印刷することです。だから私は次のように実行されるPythonで動作するコードを書きました:
def inter(arr1,arr2,p1,p2,arr):
thisarr = copy(arr)
if p1 == len(arr1) and p2 == len(arr2):
printarr(thisarr)
elif p1 == len(arr1):
thisarr.extend(arr2[p2:])
printarr(thisarr)
elif p2 == len(arr2):
thisarr.extend(arr1[p1:])
printarr(thisarr)
else:
thisarr.append(arr1[p1])
inter(arr1,arr2,p1+1,p2,thisarr)
del thisarr[-1]
thisarr.append(arr2[p2])
inter(arr1,arr2,p1,p2+1,thisarr)
return
文字列の各ポイントで発生し、1回の再帰呼び出しでは、現在の要素が最初の配列に属していると見なされ、次の呼び出しでは、他の配列に属していると見なされます。したがって、入力文字列がab
andの場合、、、、、などがcd
出力され、abcd
配列acbd
へのポインタになります(Python文字列は不変であるため、配列を使用しています!)。誰かが私に、このコードの複雑さは何ですか、そしてそれが改善できるかどうか教えてもらえますか?特定の配列から長さのすべての組み合わせを出力するための同様のコードを作成しました。cdab
cabd
p1
p2
k
def kcomb(arr,i,thisarr,k):
thisarr = copy(thisarr)
j,n = len(thisarr),len(arr)
if n-i<k-j or j >k:
return
if j==k:
printarr(thisarr)
return
if i == n:
return
thisarr.append(arr[i])
kcomb(arr,i+1,thisarr,k)
del thisarr[-1]
kcomb(arr,i+1,thisarr,k)
return
これも同じ原理で動作します。それで、一般的に、そのような関数の複雑さを見つける方法、そしてそれらを最適化するにはどうすればよいですか?DPでこれらを行うことは可能ですか?最初の問題のサンプル入出力:
>>> arr1 = ['a','b','c']
>>> arr2 = ['d','e','f']
>>> inter(arr1,arr2,0,0,[])
abcdef
abdcef
abdecf
abdefc
adbcef
adbecf
adbefc
adebcf
adebfc
adefbc
dabcef
dabecf
dabefc
daebcf
daebfc
daefbc
deabcf
deabfc
deafbc
defabc