Python 均匀混合两个元素列表(负载平衡)

Python 均匀混合两个元素列表(负载平衡),python,arrays,algorithm,sequence,load-balancing,Python,Arrays,Algorithm,Sequence,Load Balancing,假设我有两个字符串,只有一个字符: 'aaaaaaa' 'bbb' 我想找到一种算法来生成以下组合字符串: 'aabaabaaba' 将这两个字符合并,以使两个列表中的连续字符数最少(在本例中,#为2)。每个字符串的长度是任意的,我希望它是对称的。扩展到2个以上字符串的额外点数 我用python来做这件事,但是语言并不重要。这是为了解决我正在处理的负载平衡问题。您可以交替使用元素,必要时使用较长字符串的字母。您可以使用整数算术确定是否可以添加一个字母:分数告诉您每个字母对之间有多少个字母。只

假设我有两个字符串,只有一个字符:

'aaaaaaa'
'bbb'
我想找到一种算法来生成以下组合字符串:

'aabaabaaba'
将这两个字符合并,以使两个列表中的连续字符数最少(在本例中,#为2)。每个字符串的长度是任意的,我希望它是对称的。扩展到2个以上字符串的额外点数


我用python来做这件事,但是语言并不重要。这是为了解决我正在处理的负载平衡问题。

您可以交替使用元素,必要时使用较长字符串的字母。您可以使用整数算术确定是否可以添加一个字母:分数告诉您每个字母对之间有多少个字母。只要累积分数大于½,则累积分数并使用较长数组中的字母:

def intertwine(a, b):
    """ Return a combination of string with fewest number of
        consecutive elements from one string
    """

    if len(b) > len(a):
        return intertwine(b, a)

    if not b:
        return a

    a = list(a)
    b = list(b)

    num = len(a) - len(b)
    denom = len(b)
    acc = 0

    res = []

    while a or b:
        acc += num

        while acc >= denom / 2:
            if a: res += a.pop(0)
            acc -= num

        if a: res += a.pop(0)
        if b: res += b.pop(0)

    return "".join(res)



print intertwine("aaabaaa", "bbb")      # "aababbaaba"
print intertwine("aaaaaaa", "b")        # "aaabaaaa"
print intertwine("aaaaaa", "b")         # "aaabaaa"
print intertwine("aa", "bbbbbb")        # "bbabbabb"
print intertwine("", "bbbbbb")          # "bbbbbb"
print intertwine("", "")                # ""
导入itertools
def混合(*容器):
混合=[]
对于已排序容器中的c(key=lambda c:len(c)):
如果len(c)>=len(混合):
较大,较小=c,混合
其他:
较大,较小=混合,c
比率,余数=divmod(len(较大),len(较小)+1)
块大小=(比率+(如果i<余数,则为1,否则为0)表示i在范围内(len(较小)+1))
区块偏移量=itertools.CUMMATE(区块大小)
off_start=0
新组合=[]
对于i,在枚举中关闭(块偏移):
新的混合。扩展(更大[关闭开始:关闭])
如果i==len(更小):
打破
新的\u mix.append(较小的[i])
off\u start=off
混合=新的混合
返混
import itertools

def intermix(*containers):
    mix = []
    for c in sorted(containers, key=lambda c: len(c)):
        if len(c) >= len(mix):
            bigger, smaller = c, mix
        else:
            bigger, smaller = mix, c
        ratio, remainder = divmod(len(bigger), len(smaller) + 1)
        chunk_sizes = (ratio + (1 if i < remainder else 0) for i in range(len(smaller) + 1))
        chunk_offsets = itertools.accumulate(chunk_sizes)
        off_start = 0
        new_mix = []
        for i, off in enumerate(chunk_offsets):
            new_mix.extend(bigger[off_start:off])
            if i == len(smaller):
                break
            new_mix.append(smaller[i])
            off_start = off
        mix = new_mix
    return mix