Форум программистов, компьютерный форум, киберфорум
LINQ
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
12 / 12 / 5
Регистрация: 06.03.2012
Сообщений: 182
1

Разбить массив элементов на приблизительно равные части

26.02.2015, 10:14. Показов 2382. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть массив элементов, нужно разбить его на Environment.ProcessorCount массивов, с приблизительно равными элементами.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2015, 10:14
Ответы с готовыми решениями:

Разбить массив на две равные части (или приблизительно равные)
Задали задание. Нужно разбить одномерный массив на две почти равные части(если на равные не...

Разбить массив на равные N части
Есть массив, например: int lines = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; ...

Разбить массив на равные части
Всем привет! Нужно разбить массив А на m массивов равной длинны. как лучше это сделать? далее...

Ввести массив из n чисел, разбить массив на две примерно равные части и вывести числа в отдельном окне
Ввести массив из n чисел, разбить массив на две примерно равные части и вывести числа из каждой...

6
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
27.02.2015, 09:44 2
Цитата Сообщение от Castello2401 Посмотреть сообщение
с приблизительно равными элементами
Имеется в виду "с приблизительно равным количеством элементов"?
Решение пока такое, но оно меня не совсем устраивает
C#
1
2
3
4
5
6
7
8
IEnumerable<int> array = new int[] { 10, 20, 30, 40, 50, 60, 70 };
int size = array.Count() / Environment.ProcessorCount;
var result = new List<IEnumerable<int>>(); // результат тут
int skipped = 0;
while (skipped < array.Count()) {
    result.Add(array.Take(2));
    array = array.Skip(2);
}
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
27.02.2015, 20:08 3
Цитата Сообщение от Castello2401 Посмотреть сообщение
Есть массив элементов, нужно разбить его на Environment.ProcessorCount массивов
Судя по тому, что нужно Environment.ProcessorCount частей, могу предположить, что вы собираетесь обрабатывать массив в разных потоках, а раз это нужно всего лишь для обработки, то зачем его вообще разбивать? В каждый поток отправляйте ссылку на массив, с какого индекса начинать и сколько элементов обрабатывать. И пусть все потоки работают с одним и тем же массивом.
0
12 / 12 / 5
Регистрация: 06.03.2012
Сообщений: 182
27.02.2015, 21:59  [ТС] 4
Цитата Сообщение от kolorotur Посмотреть сообщение
могу предположить, что вы собираетесь обрабатывать массив в разных потоках
Именно.
Цитата Сообщение от kolorotur Посмотреть сообщение
раз это нужно всего лишь для обработки, то зачем его вообще разбивать? В каждый поток отправляйте ссылку на массив, с какого индекса начинать и сколько элементов обрабатывать
Вот так я собираюсь задействовать несколько потоков:
C#
1
2
3
4
5
6
7
8
9
10
11
12
            ParameterizedThreadStart threadStart = new ParameterizedThreadStart(data =>
                {
                    /// blablabla
                });
 
            Thread[] threads = new Thread[Environment.ProcessorCount];
 
            for (int i = 0; i < threads.Length; i++)
                threads[i] = new Thread(threadStart);
 
            foreach (var thread in threads) thread.Start(new object()); // example
            foreach (var thread in threads) thread.Join();
thread.Start принимает один аргумент типа object, по Вашему сценарию мне придется передать ему не строго типизированный массив с тремя значениями - dataArray, startIndex, dataCount, потом все это еще и распаковать придется. Дабы меньше кода было, я хочу передать потоку только массив обрабатываемых элементов.
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
28.02.2015, 09:31 5
Лучший ответ Сообщение было отмечено Castello2401 как решение

Решение

Цитата Сообщение от Castello2401 Посмотреть сообщение
по Вашему сценарию мне придется передать ему не строго типизированный массив с тремя значениями - dataArray, startIndex, dataCount, потом все это еще и распаковать придется.
Есть готовая структура ArraySegment, кода добавляет совсем немного:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            ParameterizedThreadStart threadStart = new ParameterizedThreadStart(data =>
                {
                    var segment = (ArraySegment<int>)data;
                    foreach (var number in segment)
                       // blablabla
                });
 
            Thread[] threads = new Thread[Environment.ProcessorCount];
 
            for (int i = 0; i < threads.Length; i++)
                threads[i] = new Thread(threadStart);
 
            foreach (var thread in threads) thread.Start(new ArraySegment<int>(myIntArray, 5, 25)); // example
            foreach (var thread in threads) thread.Join();
2
12 / 12 / 5
Регистрация: 06.03.2012
Сообщений: 182
28.02.2015, 10:41  [ТС] 6
То, что надо.

Добавлено через 20 минут
С использованием ArraySegment получился вот такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
            int[] array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
 
            ParameterizedThreadStart threadStart = new ParameterizedThreadStart((segment) =>
            {
                foreach (var data in (IEnumerable<int>)segment)
                {
                    Console.WriteLine(data);
                    /// blablabla
                }
            });
 
            Thread[] threads = new Thread[Environment.ProcessorCount];
 
            for (int i = 0; i < threads.Length; i++)
                threads[i] = new Thread(threadStart);
 
            int offset;
            int count = array.Length / Environment.ProcessorCount;
            
            for (int i = 0; i < Environment.ProcessorCount; i++)
            {
                offset = i * count;
                ArraySegment<int> segment = new ArraySegment<int>(array, offset, count);
                threads[i].Start(segment);
            }
 
            foreach (var thread in threads) thread.Join();
Осталось решить вопрос с нечетносью переменной count
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
01.03.2015, 19:05 7
Цитата Сообщение от Castello2401 Посмотреть сообщение
Осталось решить вопрос с нечетносью переменной count
Остаток пусть обрабатывает последний поток — не треснет
0
01.03.2015, 19:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2015, 19:05
Помогаю со студенческими работами здесь

Разбить файл на равные части
Подскажите пожалуйста, как разбить файл с содержимым, средствами с++ на равные части(последний...

Разбить строку на равные части
допустим есть строка S:='21545789654785124587963254785125847'; //35 символов как ее разбить на...

Разделить массив на две равные части, суммы элементов которых наиболее близки к равности
Мне нужно разделить массив на две равные части, суммы элементов которых наиболее близки к равности....

Разбить массив на 4 части по диагонали и посчитать сумму в каждой части
Двумерный массив. Разбить массив на 4 части по диагонали и посчитать сумму в каждой части. Помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru