powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Разбить ArrayList на максимально равные по количеству элементов части
27 сообщений из 27, показаны все 2 страниц
Разбить ArrayList на максимально равные по количеству элементов части
    #39827202
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Нужен алгоритм, который делит большой ArrayList на несколько мелких ArrayList так, чтобы полученные мелкие ArrayList были максимально равны по количеству элементов.

Например:
100 / 5 = 20 + 20 + 20 + 20 + 20
101 / 5 = 20 + 20 + 20 + 20 + 21
13 / 4 = 3 + 3 + 3 + 4
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827223
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВсем привет!

Нужен алгоритм, который делит большой ArrayList на несколько мелких ArrayList так, чтобы полученные мелкие ArrayList были максимально равны по количеству элементов.

Например:
100 / 5 = 20 + 20 + 20 + 20 + 20
101 / 5 = 20 + 20 + 20 + 20 + 21
13 / 4 = 3 + 3 + 3 + 4

100р на телефон и я напишу Вам эту лабораторку.
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827225
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВсем привет!

Нужен алгоритм, который делит большой ArrayList на несколько мелких ArrayList
На сколько частей?
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827228
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если количество частей заранее не определено, то в цикле делить длину большого массива на переменное число частей и смотреть дробную часть от полученного значения.
Если она близка к нулю или к единице, то найденное число делителя это подходящее значение.
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827235
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008Если количество частей заранее не определено, то в цикле делить длину большого массива на переменное число частей и смотреть дробную часть от полученного значения.
Если она близка к нулю или к единице, то найденное число делителя это подходящее значение.
Количество частей заранее неизвестно.
А если не близко к 0 или 1, например:
13 / 5 = 2,6

Как получить оптимальный вариант: 3 + 3 + 3 + 2 + 2?
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827243
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar...
Количество частей заранее неизвестно.
А если не близко к 0 или 1, например:
13 / 5 = 2,6

Как получить оптимальный вариант: 3 + 3 + 3 + 2 + 2?
Обычный, самый тупой, алгоритм диззиринга из графики:

2 (trunc(2.6) ошибка 0.6) + 3 (trunc(2.6+0.6) ошибка 2.6+0.6-3=0.2) + 2 (ошибка 2.6+0.2-3=0.8) + 3 (ошибка 0.4) + 3 (ошибка 0)

2 + 3 + 2 + 3 + 3

IMHO
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827245
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
MolasarSQL2008Если количество частей заранее не определено, то в цикле делить длину большого массива на переменное число частей и смотреть дробную часть от полученного значения.
Количество частей заранее неизвестно.
А если не близко к 0 или 1, например:
13 / 5 = 2,6

Как получить оптимальный вариант: 3 + 3 + 3 + 2 + 2?
Используйте алгоритм Брезенхема для прямой (из (0;0) в (N;K), где N — длина масива, K — кол-во частей)
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827252
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВсем привет!

Нужен алгоритм, который делит большой ArrayList на несколько мелких ArrayList так, чтобы полученные мелкие ArrayList были максимально равны по количеству элементов.

Например:
100 / 5 = 20 + 20 + 20 + 20 + 20
101 / 5 = 20 + 20 + 20 + 20 + 21
13 / 4 = 3 + 3 + 3 + 4

условия не очень понятны.

почему 13/4 хуже чем 13/2(6+7) или 13/3(5+4+4)?

Постановка задачи - загадчная.
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827254
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое загадочное - это ответ
Т.к. ArrayList наиболее правильно бьется просто на 13-ть ArrayList'ов
И тогда все получившиеся ArrayList'ы будут не просто максимально, а совершенно точно "равны по количеству элементов"
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827265
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСамое загадочное - это ответ
Т.к. ArrayList наиболее правильно бьется просто на 13-ть ArrayList'ов
И тогда все получившиеся ArrayList'ы будут не просто максимально, а совершенно точно "равны по количеству элементов"

наверняка неявно подразумевается что минимальное количество элементов в каждом из разбитых 2
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827270
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingLeonid KudryavtsevСамое загадочное - это ответ
Т.к. ArrayList наиболее правильно бьется просто на 13-ть ArrayList'ов
И тогда все получившиеся ArrayList'ы будут не просто максимально, а совершенно точно "равны по количеству элементов"

наверняка неявно подразумевается что минимальное количество элементов в каждом из разбитых 2
тогда почему бы все не бить на 2 или 2+1?
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827282
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озвериннаверняка неявно подразумевается...

я бы скорее подумал. что подразумевается кол-во частей sqrt( ArrayList.count )
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827289
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasarВсем привет!

Нужен алгоритм, который делит большой ArrayList на несколько мелких ArrayList так, чтобы полученные мелкие ArrayList были максимально равны по количеству элементов.

Например:
100 / 5 = 20 + 20 + 20 + 20 + 20
101 / 5 = 20 + 20 + 20 + 20 + 21
13 / 4 = 3 + 3 + 3 + 4

условия не очень понятны.

почему 13/4 хуже чем 13/2(6+7) или 13/3(5+4+4)?

Постановка задачи - загадчная.
Изначально неизвестно на какое количество частей нужно делить ArrayList. Для простоты будем говорить про массив.
Размер массива тоже неизвестен.
13/4 не хуже чем 13/2(6+7).
Если делитель 4, то должно быть 3 + 3 + 3 + 4 или 4 + 3 + 3 + 3.
Если делитель 2, то 6+7
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827304
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСамое загадочное - это ответ
Т.к. ArrayList наиболее правильно бьется просто на 13-ть ArrayList'ов
И тогда все получившиеся ArrayList'ы будут не просто максимально, а совершенно точно "равны по количеству элементов"
Приходит Object[N] его нужно обработать на K-потоках. Для этого необходимо, чтобы каждому потоку досталась максимально равная часть работы, т.е. часть массива. Вот поэтому и делим.
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827328
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жесть. А про пул потоков не слышали?
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827333
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никЖесть. А про пул потоков не слышали?
Слышал и???
Как вы раздадите одну задачу на пул потоков????
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827335
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar, очевидно разобью на маленькие части. один элемент массива - одна задача
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827347
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никMolasar, очевидно разобью на маленькие части. один элемент массива - одна задача
А если данные нужно сохранить в БД. Например, 100000 строк.
Вы будете под запись каждой строки выделять поток?
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827348
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarLeonid KudryavtsevСамое загадочное - это ответ
Т.к. ArrayList наиболее правильно бьется просто на 13-ть ArrayList'ов
И тогда все получившиеся ArrayList'ы будут не просто максимально, а совершенно точно "равны по количеству элементов"
Приходит Object[N] его нужно обработать на K-потоках. Для этого необходимо, чтобы каждому потоку досталась максимально равная часть работы, т.е. часть массива. Вот поэтому и делим.


наверное, это задача решается немного иначе.

1. Во-первых, вы должны исходить из некой пропускной способности. Допустим, 10 объектов в секунду.
2. Во-вторых, вы должны знать максимально эффективное кол-во потоков, которое имеет смысл пускать на сервере(если все измеряется потоками). Делается это через нагрузочное тестирование.
3. В-третьих, просто следить за пропускной способностью и добавлять потоки, когда требуется до n потоков.


В общем случае, вам может подойти нечто вроде disruptor`а - этий кольцевой массив событий, который обрабатывает несколько консьюемров, причем могут сразу пачкой(если логика позволяет).
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827350
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasarзабыл никMolasar, очевидно разобью на маленькие части. один элемент массива - одна задача
А если данные нужно сохранить в БД. Например, 100000 строк.
Вы будете под запись каждой строки выделять поток?

так это вы все еще про запись в бд что ли? Не поборол?
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827357
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasarзабыл никMolasar, очевидно разобью на маленькие части. один элемент массива - одна задача
А если данные нужно сохранить в БД. Например, 100000 строк.
Вы будете под запись каждой строки выделять поток?
Начинаешь задавать правильные вопросы.

К тем пунктам что добавил Озверин, ты должен решить задачу написав функцию, которая принимает на вход int(число элементов в массиве) и вычисляет другой int(количество элементов в партитишене), учитывая коээфициенты -
1) количество потоков в системе
2) CPU или IO-bound таск. При CPU-bound коэффийиент должен быть строго 1, при IO - от 2-5 обычно, но надо мерять на реальной нагрузке
3) минимальное количество элементов на один таск, ибо если у тебя мало элементов, то нету особого смысла параллелить.
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39827363
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar....Вот поэтому и делим.

просто циклично кидать в ArrayList'ы по одной штуке

Был на входе набор элементов 1,2,3,4,5,6,7
нужно побить на 3-и массива, просто циклически в массивы и кидаете
массив A: 1, 4, 7
массив B: 2, 5, не хватило
массив C: 3, 6, не хватило

в чем проблема - мне не понятно. Можно "размазать" 21909803 . Можно заранее посчитать, какая будет длина короткого массива truncate( length / threads_count ), сколько будет "перебравших +1" ( length % threads_count ), сколько будет "коротких" ( threads - length % threads_count).

Если запросом, то опять таки:

SELECT rownum mod threads_count as n, my_table.* FROM my_table

Задача не стоящая выяденного яйца. IMHO
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39828981
Фотография Мозговой_слизень
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСамое загадочное - это ответ
Т.к. ArrayList наиболее правильно бьется просто на 13-ть ArrayList'ов
И тогда все получившиеся ArrayList'ы будут не просто максимально, а совершенно точно "равны по количеству элементов"

5 баллов! ИМХО просто шедеврально. И главное, укладывается в "условия задачи".
Но можно пойти еще дальше. Зачем нам 13-ть ArrayList'ов, зачем память засирать. Лучше пусть будет 1. Таким, образом, мы пришли к выводу, что задачу решать вообще не имеет смысла. Можно считать ее решенной уже на этапе постановки.

Зачем подниматься на 3-ий этаж и спускаться на первый, если по условиям задачи нужно быть на первом. Можно просто не подниматься.
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39828982
Фотография Мозговой_слизень
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingLeonid KudryavtsevСамое загадочное - это ответ
Т.к. ArrayList наиболее правильно бьется просто на 13-ть ArrayList'ов
И тогда все получившиеся ArrayList'ы будут не просто максимально, а совершенно точно "равны по количеству элементов"

наверняка неявно подразумевается что минимальное количество элементов в каждом из разбитых 2

Нельзя ли уточнить. А то так придешь к врачу, он тебе так неявно не то лекарство даст и неявно откинешься.
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39829086
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
офигенный пример того, почему на любой заданный вопрос нужно отвечать вопросом "объясни, зачем это нужно"
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39829126
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
100 / 5 = 20 + 20 + 20 + 20 + 20
101 / 5 = 20 + 20 + 20 + 20 + 21
13 / 4 = 3 + 3 + 3 + 4


Тут - простой алгоритм. Целочисленного деления и остатка (%) достаточно.
...
Рейтинг: 0 / 0
Разбить ArrayList на максимально равные по количеству элементов части
    #39831678
UScorp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется мне, что все же использовать пул потоков будет правильнее.

Разным потокам может быть выделено разное кол-во ресурсов и отработать они могут за разное время.

Допустим надо будет вставить 10к записей в 5 потоков, дадим каждому потоку по 2к записей и запустим их одновременно. Первый поток выполниться за 1мин, второй за 3 мин, третий за 2мин, четвертый за 2,5 мин, а пятому не повезло, его все кругом ущемляют и он выполнился за 10 мин.

Тогда получается, что 7-8 минут работал только один "ущербный" поток, а остальные потоки ему не помогали.
Если бы мы раздробили данные на более мелкие порции (допустим по 200 записей), то более быстро освободившийся поток мог бы взять следующую небольшую порцию. Тогда они бы завершили свою работу все более или менее равномерно.

Добавлю - это все ИХМО ))))
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Разбить ArrayList на максимально равные по количеству элементов части
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]