【发布时间】:2018-03-10 21:00:09
【问题描述】:
我正在执行一项统计分析,以确定是否有可能通过在特定时间范围内将较大的交易拆分为较小的交易来隐藏该交易。我正在做的是将较大的数据集分解为较小的子集(目前为 12 个数组),然后在每个子集上运行一系列循环,以确定元素的任何组合是否加起来在目标范围内。
这是我当前的代码:
amounts_matrix = [1380.54,9583.33,37993.04,3240.96...]
matrix_amounts = amounts_matrix.length
total_permutations = 0;
total_hits = 0;
target_range = 1
target = 130000
low_threshold = target - target_range
high_threshold = target + target_range
entries = []
range = 12
for(x = 0; x< matrix_amounts-(range-1); x++){
amounts = amounts_matrix.slice(x, x+range)
total_amounts = range
for(i = 0; i< total_amounts; i++){
entries.push(amounts[i])
totalcheck(entries)
entries = []
}
for(i = 0; i< total_amounts; i++){
for(j = i+1; j< total_amounts; j++){
entries.push(amounts[i])
entries.push(amounts[j])
totalcheck(entries)
entries = []
}
}
...
for(i = 0; i< total_amounts; i++){
for(j = i+1; j< total_amounts; j++){
for(k = j+1; k< total_amounts; k++){
for(l = k+1; l< total_amounts; l++){
for(m = l+1; m< total_amounts; m++){
for(n = m+1; n< total_amounts; n++){
for(o = n+1; o< total_amounts; o++){
for(p = o+1; p< total_amounts;p++){
for(q = p+1; q< total_amounts;q++){
for(r = q+1; r< total_amounts;r++){
for(s = r+1; s< total_amounts;s++){
for(t = s+1; t< total_amounts;t++){
entries.push(amounts[i])
entries.push(amounts[j])
entries.push(amounts[k])
entries.push(amounts[l])
entries.push(amounts[m])
entries.push(amounts[n])
entries.push(amounts[o])
entries.push(amounts[p])
entries.push(amounts[q])
entries.push(amounts[r])
entries.push(amounts[s])
entries.push(amounts[t])
totalcheck(entries)
entries = []
}
}
}
}
}
}
}
}
}
}
}
}
}
function totalcheck(array){
total_permutations += 1;
sum_amount = 0
for(z = 0; z < array.length; z++){
sum_amount += array[z]
}
if(sum_amount > low_threshold && sum_amount < high_threshold){
total_hits += 1
console.log(array)
console.log(sum_amount.toFixed(2))
console.log("---------------")
}
}
console.log("overall total hits = " + total_hits)
console.log("overall total permutations = " + total_permutations)
我对那些 for 循环的广泛性感到非常尴尬,我想用一个函数来概括它,我可以告诉它运行 X 循环,而不是像这样构建它们。我发现的置换函数对我来说并不可行,因为它们都构建了充满全部可能性的数组;在我的工作中,我想检查目标,以避免出现巨大的数组并遇到内存问题。如何构建一个递归循环来做到这一点?
【问题讨论】:
-
使用内存有什么问题?我读了你的问题,我想到的第一件事是“建立一系列总的可能性”。那是问题吗?为什么?
-
你 c̶a̶n̶n̶o̶t̶ 不能合理地创建一个函数来创建循环,eval() 函数可以帮助你,但是,一个操纵它运行的循环数的函数可以很容易地完成,并且回调甚至可以提供给每个循环独特的功能
-
因为我希望能够使用比 12 更大的窗口来完成它 - 这将使我进入 50 个数组的领域!长甚至更大。
-
你能解释一下这应该怎么做吗?我想有一个更短+更好的解决方案
-
我知道 'amounts_matrix' 无法重新组织,但 'amounts' 是您执行循环的子采样数组,除非我弄错了。这就是我建议您订购的东西,它会大大提高效率,并包含逻辑。
标签: javascript recursion accounting