问题描述
我有5个单词清单。让我们称它们为list1
,list2
,list3
,list4
,list5
。
有一个包含2048个单词的单词超集。
每个列表都包含单词超集中的全部或部分单词。
示例:superset = ['one','two','three','a','b','c','d','e','f','h','i','j','k','g','z','blie']
list1 = ['one','three'];
list2 = ['a','c'];
list3 = ['d','f'];
list4 = ['g'];
list5 = ['h','k'];
最后的字符串res
是通过串联每个列表中的一个单词而生成的。
例如:'one' + 'b' + 'f' + 'g' + 'k' = 'onebfgk
我有一个解码功能,该功能接受res
并输出一个数字。
我有兴趣找到能解码为给定数字的字符串:prize
。
当前,我正在生成res
的所有可能组合,对其进行解码并将其与给定的prize
进行匹配。
我当前的node.js脚本如下所示:
var prize = 1234;
var list1 = ['one','three'];
var list2 = ['a','c'];
var list3 = ['d','f'];
var list4 = ['g'];
var list5 = ['h','k'];
var word1 = '';
var word2 = '';
var word3 = '';
var word4 = '';
var word5 = '';
for (var n = 0; n < list1.length; n++) {
word1 = list1[n];
for (var m = 0; m < list2.length; m++) {
word2 = list2[m];
for (var o = 0; o < list3.length; o++) {
word3 = list3[o];
for (var p = 0; p < list4.length; p++) {
word4 = list4[p];
for (var q = 0; q < list5.length; q++) {
word5 = list5[q];
let res = word1 + word2 + word3 + word4 + word5;
if (decode(res) == prize){
console.log(res);
throw new Error("Found the match. The program will Now exit");
}
}
}
}
}
}
我有兴趣加快速度。 如何通过使脚本使用GPU或多处理/并行处理或任何其他方式来修改脚本以大幅度提高速度?
由于解码功能来自节点模块,因此我只能使用node.js。
解决方法
NodeJS实际上是用C ++编写的,因此,如果您要执行一些占用大量资源的工作,我建议您使用NodeJS addons feature。这是我发现优化某些需要在NodeJS中使用蛮力算法的代码的最佳方法。
在我的一些项目中,有一些我做得很好的关于这个主题的教程:
显然,这需要您了解一些C ++,但我认为没有更好的方法,因为您的目标是纯粹的优化和潜在的多线程操作。
您的C ++代码的第一种方法是:
at
如果您尊重N-API配置,则nodeJS文件应如下所示:
df.at[index_4='D0']['Something1']['2020-03-31'] = new_df['D0','2020-03-31']['val']
编辑:添加了示例+ C ++代码