【发布时间】:2016-08-09 06:41:25
【问题描述】:
我有 13 个不同的单词。 我需要得到这些词的所有组合这样的排列:
word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12 word13
但组合只能是 12 个字长。
我已经在 python 中有一个脚本来执行此操作:
import time
start = time.time()
items = ['word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'word10, 'word11', 'word12', 'word13']
from itertools import permutations
for p in permutations(items, 12):
print(p)
print 'It took', time.time()-start, 'seconds.'
但是太慢了,组合只有4个字的时候需要24秒。
javascript tool 只需要 1 秒就可以输入多达 9 个不同的单词;但是当尝试 10 个不同的单词时,浏览器崩溃了。
有没有一种快速有效的方法来做到这一点?也许是awk?
编辑:
这与Generating permutations using bash 不是同一个问题,因为这个问题有 13 个单独的单词,而另一个线程中的答案不适用于单词。
亲切的问候。
【问题讨论】:
-
对于排列和组合的术语经常存在混淆,所以让我们澄清一下您要查找的内容。假设只有三个单词:
A、B和C,并且您正在寻找 2 个单词长的组合列表。你期待哪个列表? (1)AB,AC,BA,BC,CA,CB(2)AB,AC,BC(即订单无关紧要) (3)AA,AB,AC,BA,BB,BC,CA,CB,CC(4)AA,AB,AC,BB,BC,CC -
会在您的示例中使用列表 (1):
-
这里的主要问题是会有 60 亿个排列,所以即使是最高效的程序也会遇到困难,因为它不仅要生成它们,而且实际上必须对它们做一些事情。例如,在您的脚本中,对
print的调用是最慢的部分。如果将它们存储在一个文件中,它们可能至少需要 500 GB。你想用这些排列做什么? -
是的,我知道它将在 300GB 左右。我需要它们在一个文件中。实际上我必须这样做,因为我有一个 12 字的比特币 BIP39 助记符,我不记得单词的顺序,只记得单词。获得文件后,我想编写一个脚本来检查它们中的每一个是否符合 BIP39 标准的有效助记符。否则我的比特币会丢失:/
-
这很酷。如果从文件中读取而不是直接在
for p in permutations(items, 12)下检查,那么检查每个排列的第二部分是否更容易编写?
标签: string text awk permutation words