Проблемы с реализацией многопоточной сортировки слиянием в Javascript - PullRequest
1 голос
/ 08 мая 2019

Я новичок в кодировании для параллельной обработки и пытаюсь реализовать многопоточный алгоритм сортировки слиянием.Мне неясно, как правильно использовать потоки и как именно они работают, но я все равно пытался их реализовать, и именно здесь я и приземлился.(говорит мне, что срез не является функцией)

function pMergeSort(input, done) {
	const spawn = require('threads').spawn;


	if (input.length< 2)
		return input;
	function partition(arr) { 
	let middle = Math.floor(arr.length / 2);
	let left = arr.sclice(0, middle);
	let right = arr.slice(middle + 1, arr.length);
	}
	 let left,right=partition(input);
	let task = spawn(pMergeSort).send(left).on('done', function (arr) {
		if (result === undefined) {
			for (let i = 0; i< n.length; i++) {
				result[i] = n[i];
			}
		}else {
			merge(result, n);
			left.kill();
		}
	});
	pMergeSort(right, function (n) {
		if (result === undefined) {
			for (let i = 0; i< n.length; i++) {
				result[i] = n[i];
			}
		}else {
			merge(result, n);
			right.kill();
		}
	});

}

/*
function mergeSort (arr) {
    if (arr.length === 1) {
        // return once we hit an array with a single item
        return arr
    }

    const middle = Math.floor(arr.length / 2) // get the middle item of the array rounded down
    const left = arr.slice(0, middle) // items on the left side
    const right = arr.slice(middle) // items on the right side

    return merge(mergeSort(left), mergeSort(right))
}*/

// compare the arrays item by item and return the concatenated result
function merge(left, right) {
	let result = []
	let indexLeft = 0
	let indexRight = 0

	while (indexLeft < left.length && indexRight < right.length) {
		if (left[indexLeft] < right[indexRight]) {
			result.push(left[indexLeft])
			indexLeft++
		} else {
			result.push(right[indexRight])
			indexRight++
		}
	}
	return result.concat(left.slice(indexLeft)).concat(right.slice(indexRight))
}
function genArray(size) {
	// randomly fills arr
	var arr = Array(size);
	for (var i = 0; i < size; i++) {
		arr[i] = Math.floor(Math.random() * 98);
	}
	return arr
}
function testParallel(){
	var array=genArray(Math.floor(Math.random()*100));
	pMergeSort(array, function(i){
		console.log(JSON.stringify(i));
	})
}
var testArr = genArray(2);
pMergeSort(testArr, function (i) {
	console.log(JSON.stringify(i));
});

помочь в реализации этого было бы удивительно, но некоторые простые вопросы, которые могли бы подтолкнуть меня в правильном направлении, это: слияние pMergeSort должно быть функцией обратного вызова?как вы определяете свою функцию обратного вызова?Было бы лучше использовать пул потоков, а не пытаться порождать потоки?И функция, заключенная в pMergeSort, должна быть сортировкой слиянием + разбиением на потоки, верно?

...