#java #algorithm
#java #алгоритм
Вопрос:
Я пытаюсь нарезать список (вызовите этот список ввода и он содержит элементы типа данных Java double) на несколько частей (вложенные списки). Размер вложенных списков может быть неравным на небольшое число. Каждая часть (вложенный список) служит в качестве входных данных для другой программы. Размер входного списка — это переменная с максимальным размером 10000, то есть он может быть как 1, или 2, или 3, так и большим, как 100, или 10000, или любое число меньше 10000.
Каков наилучший способ разделить такой список на несколько частей? Я рассматривал распределение 3h 1 Дональда Кнута при проектировании пробелов для сортировки оболочки. Однако я не уверен, будет ли это уместно. Ценю вашу помощь.
Спасибо!
Комментарии:
1. Для чего вы хотите нарезать список?
2. Это действительно зависит от условия, которое вы хотите нарезать
3. @java_pill — вы просто планируете нарезать его на основе количества записей? или какие-то критерии в самих данных? Что определяет, как разделить список?
Ответ №1:
Чтобы расширить ответ, укажите оптимальное значение M,
Предположим, что существует некоторая функция затрат C, связанная с обработкой списка размера M.
Затем вы хотите минимизировать функцию
Общая стоимость = M * C (N / M) накладные расходы
где накладные расходы — это стоимость разделения списка.
Я думаю, что для большинства приложений не было бы большой разницы для разных значений M, поэтому нет смысла разделять его.
Ситуация, в которой это было бы полезно, заключается в том, что у вас есть несколько процессоров so, и вы можете передать подсписки другому процессору. В этом случае функция стоимости была бы больше похожа
Общая стоимость = C (N / M) накладные расходы, если M < количество процессоров
таким образом, вы должны выбрать M, чтобы оно было близко к количеству процессоров, но меньше его.
Ответ №2:
Если я не неправильно понимаю этот вопрос, это кажется простым.
Учитывая список размером N, создать M подсписков, где M < N,
- создайте M-1 списков размером K = N / M
(округление в меньшую сторону) - создайте список размером M — (M — 1) * K
Затем
- скопируйте первые K элементов в первый список
- скопируйте следующие K элементов во второй список,
- и так далее,
- наконец, скопируйте последнее M — (M — 1) * K в последний список.
Комментарии:
1. Каким было бы оптимальное значение для M? учитывая, что N меняется. Или как вы определяете значение M?
2. Оптимальное значение для M зависит от характеристик приложения. Дешевле ли обрабатывать N списков размером N / M по сравнению с одним списком размером N? Если да, то по какому коэффициенту?