【问题标题】:How to merge two lists to find minimal repetition factor?如何合并两个列表以找到最小重复因子?
【发布时间】:2019-04-28 06:18:47
【问题描述】:

例如,我有两个列表

A = ["spin", "dab", "dab", "moonwalk", "clap", "moonwalk"]
B = ["dab", "dab", "spin", "clap", "clap", "moonwalk"]

合并两个列表后,我可以有一个这样的列表

remix=["dab", "spin", "dab", "spin", "dab", "clap", "dab", "moonwalk", "clap", "moonwalk", "clap", "moonwalk"]

我的问题是如何合并两个列表,使元素的相邻重复最小(A 和 B 中的所有元素都必须出现在混音列表中)。 重复是这样的

remix=["spin", "dab", "spin", "dab", "dab", "clap", "dab", "moonwalk", "clap", "moonwalk", "clap", "moonwalk"]

这里的相邻重复是2*dab

另一个例子是

remix=["spin", "dab", "spin", "dab", "dab", "clap", "clap","dab", "moonwalk", "moonwalk", "clap", "moonwalk"]

相邻的重复是2*dab+2*clap

下面是这个问题的输入

A = ["spin", "dab", "dab", "moonwalk", "clap", "moonwalk"]
B = ["dab", "dab", "spin", "clap", "clap", "moonwalk"]
factor={"spin":1,"dab":2,"moonwalk":3,"clap":4}

输出列表:

["dab", "spin", "dab", "spin", "dab", "clap", "dab", "moonwalk", "clap", "moonwalk", "clap", "moonwalk"]

原因是没有重复所以任何元素的相邻重复都是0。 同样,目标是找到具有最少相邻重复的列表,当然如果我们可以找到完全没有重复的列表,则因子可能为 0

我在考虑动态编程,但我不知道如何使它工作。任何帮助表示赞赏。

【问题讨论】:

  • 使用A + B组合列表AB
  • 所以你想合并列表以尽量减少相邻重复?是对的吗? dab, dab, clap 是重复的,但 spin, dab, spin 不是?
  • 目标是找到最小的重复因子。如果没有重复,那么这是最好的解决方案,否则输出具有最小重复因子的列表
  • @Mark Meyer 完全正确。
  • 请编辑您尝试将其编码到您的问题中。来吧,你一定尝试过什么。

标签: python algorithm dynamic-programming


【解决方案1】:

我不太确定您的预期输出。你的意思是这样的吗?

import random
A = ["spin", "dab", "dab", "moonwalk", "clap", "moonwalk"]
B = ["dab", "dab", "spin", "clap", "clap", "moonwalk"]

AB = A + B
elem = AB
while elem != []:
    random.shuffle(AB)
    elem = []
    for i in range(len(AB)-1):
        if AB[i] == AB[i+1]:
            elem.append([AB[i],AB[i+1]])
    print (AB)
    print (elem)
    print ("Repetition factor: ")
    for e in elem:
        print(str(len(e)) + "*" + e[0])
    print ("\n")

输出:

['spin', 'moonwalk', 'dab', 'dab', 'spin', 'dab', 'moonwalk', 'moonwalk', 'clap', 'clap', 'dab', 'clap']
[['dab', 'dab'], ['moonwalk', 'moonwalk'], ['clap', 'clap']]
Repetition factor: 
2*dab
2*moonwalk
2*clap

['spin', 'dab', 'clap', 'dab', 'moonwalk', 'dab', 'dab', 'clap', 'moonwalk', 'clap', 'moonwalk', 'spin']
[['dab', 'dab']]
Repetition factor: 
2*dab

['moonwalk', 'dab', 'clap', 'moonwalk', 'clap', 'dab', 'spin', 'dab', 'moonwalk', 'clap', 'dab', 'spin']
[]
Repetition factor: 

【讨论】:

  • 感谢您的回复,但您的回答似乎无法计算输出列表的因子。例如 ["spin"、"dab"、"dab"、"moonwalk"、"clap"、"moonwalk"、"dab"、"dab"、"spin"、"clap"、"clap"、"moonwalk" ],因子应该是 2*dab+2*dad 但我不确定这是否是所有可能输出列表中的最小因子
  • 已更新。看看有没有帮助
  • 为什么要投反对票?如果有什么需要改进的建议我
  • 再次感谢,是的,这可能是解决问题的一种方法。但是您的算法是随机找到所有可能的列表并计算无法产生最佳解决方案的最小值,如果输入很大,可能会花费很多时间
  • 是的,你是对的。如果数据量大,缺点是需要很长时间。
猜你喜欢
  • 2014-06-13
  • 2017-06-05
  • 2021-02-11
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多