javascript - 具有/正态曲线子数组长度的 1D -> 2D 数组

标签 javascript arrays gaussian splice batching

我试图将一维数组分解为二维数组,其中子数组的长度不同。该方差应遵循高斯曲线[或土丘形状]。因此,假设我们创建的二维数组变量名为 gaussianCurve。 gaussianCurve[0] 和 gaussianCurve[n] 内的数组长度为 1,gaussianCurve[n/2] 是参数“maxArrayLength”提供的最大值。这迫使 gaussianCurve 索引的数量变得可变。

假设我有以下伪代码:

function (oneDimentionalArray, maxArrayLength) {
// oneDimentionalArray is ["A","B","C","D","E","F","G","H","I","J","K"]
// maxArrayLength is 5
// Currently working like this (i.e. "batches"):
// return [["A","B","C","D","E"],["F","G","H","I","J"],["K"]]
// would LIKE it to work like this
    gaussianCurve = []
    gaussianCurve.push(["A"])
    gaussianCurve.push(["B", "C"])
    gaussianCurve.push(["D", "E", "F", "G", "H"])
    gaussianCurve.push(["I", "J"])
    gaussianCurve.push(["K"])

    return  gaussianCurve
}

我为什么想要这样的东西?进度条。

  1. 他们没有表明我正在立即取得进步
    1. 这是因为第一个作业必须在栏移动之前完成
  2. 速度减慢到 95% 以上,有时甚至停留在 100%
    1. 只是烦人

欢迎任何建议。我只是在脑海中没有看到答案。

编辑:我觉得措辞不好,所以我重新措辞。

...gaussianCurve[0].length & gaussianCurve[gaussianCurve.length - 1].length 将为 1,并且 gaussianCurve[gaussianCurve.length/2].length 将达到“maxArrayLength”。

输入:

function gaussianRefactor(["A","B","C","D","E","F","G","H","I","J","K"], 1)
function gaussianRefactor(["A","B","C","D","E","F","G","H","I","J","K"], 2)
function gaussianRefactor(["A","B","C","D","E","F","G","H","I","J","K"], 4)
function gaussianRefactor(["A","B","C","D","E","F","G","H","I","J","K"], 8)
function gaussianRefactor(["A","B","C","D","E","F","G","H","I","J","K"], 16)

输出:

[["A"],["B"],["C"],["D"],["E"],["F"],["G"],["H"],["I"],["J"],["K"]]
[["A"],["B","C"],["D","E"],["F","G"],["H","I"],["J"],["K"]]
[["A"],["B","C","D"],["E","F","G","H"],["I","J","K"]]
[["A"],["B","C","D","E","F","G","H","I"],["J","K"]]
[["A","B","C","D","E","F","G","H","I","J","K"]]

内部数组的长度不能超过 maxArrayLength

最佳答案

我快速尝试了一下,似乎有效。一些潜在的改进:

  • 函数的输入检查
  • 它将任何可能的剩余值放入中间容器中。对于偶数的总垃圾箱,它会受益于一些平衡。之后,最好尝试根据输入数据中的原始索引对每个 bin 进行排序,因为现在事情可能会乱序。但如果这只是为了让进度条具有非线性分布的作业,则顺序可能并不重要。

function probability(s, m, x) {
	var eExp = -Math.pow(x - m, 2) /
		(2 * Math.pow(s, 2));
	return 1/(Math.sqrt(2*Math.PI) * s) *
		Math.pow(Math.E, eExp);
}

function gassianArray(input, nBins) {
	// first try to determine a reasonable value of s so that the outer bins have a value
	var s = 0.1;
	var sMax = 10;
	var m = (nBins - 1) / 2.0;
	var outerBinMinimum = 1 / input.length;
	var p = 0;
	while (true && s <= sMax) {
		p = probability(s, m, 0);
		if (p >= outerBinMinimum) {
			break;
		} else {
			s += 0.1;
		}
	}

	// holds arrays
	var output = [];
	// holds desired array sizes
	var outputLengths = [];
	// fill these based on probability density
	for (var b=0; b<nBins; b++) {
		var n = Math.floor(probability(s, m, b) * input.length);
		output.push([]);
		outputLengths.push(n);
	}

	// fill arrays from outside, leaving extra values for the middle
	var midIndex = Math.floor(m);
	// left side
	for (var i=0; i<midIndex; i++) {
		for (var j=0; j<outputLengths[i]; j++) {
			output[i].push(input.shift());
		}
	}
	// right side
	for (var i=nBins-1; i>=midIndex; i--) {
		for (var j=0; j<outputLengths[i]; j++) {
			output[i].push(input.pop());
		}
		output[i].reverse();
	}
	// whatever remains goes in the "middle"
	while (input.length !== 0) {
		output[midIndex].unshift(input.pop());
	}

	return output;
}

var input = ["A","B","C","D","E","F","G","H","I","J","K"];
var n = 5;
console.log(gassianArray(input, n));
/*
[ [ 'A' ],
  [ 'B', 'C' ],
  [ 'E', 'D', 'F', 'G', 'H' ],
  [ 'I', 'J' ],
  [ 'K' ] ]
*/


var input = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
var n = 6;
console.log(gassianArray(input, n));
/*
[ [ 'A' ],
  [ 'B', 'C', 'D', 'E' ],
  [ 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N' ],
  [ 'O', 'P', 'Q', 'R', 'S', 'T', 'U' ],
  [ 'V', 'W', 'X', 'Y' ],
  [ 'Z' ] ]
*/

关于javascript - 具有/正态曲线子数组长度的 1D -> 2D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55943151/

相关文章:

c - 阵列输出困难

c++ - 线弯曲的简单算法

javascript - 修改元素属性后 Jquery 选择器不起作用

等效于此数组的 c++ vector

javascript - 将特定对象(根据给定条件)从对象数组复制到AngularJS中的另一个数组中

javascript - 如何获取数组中的公共(public)值

Python:具有非线性最小二乘的双曲线高斯拟合

python - rbf 和 scipy 的二维概率分布

javascript - 可以将 CSS 背景图像列为 HTML 图像标记的脚本?

javascript - 如何从字符串生成随机文本