ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
#1 | |
Разбиения множества - C++18.05.2012, 19:38. Просмотров 5061. Ответов 82
Метки нет Все метки)
(
Добрый вечер.
У меня есть множество точек в трехмерном пространстве, которые я считала и занесла в двухмерный массив. Задача состоит в том, чтобы рассмотреть все разбиения этого множества на два и сравнить их центры тяжести. Но как сравнить я знаю, а вот как разбить понятия не имею. Например, если у меня три точки, то должно получится три варианта разбиения. Программирую на Си.
0
|
|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
|
18.05.2012, 19:38 |
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Разбиения множества (C++):
82
Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В - C++ Функция разбиения матрицы на две - C++ Алгоритм разбиения массива на подмассивы - C++
Функция разбиения строки в части [C++] - C++ Множества. Вычислить количество элементов множества Q, связанного c исходными множествами - C++ |
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 12:06 | #16 |
Нужен цикл в основной программе и в нем вызов функции grouping. Ну, я приводил этот кусок кода.
А что вы имеете в виду под комбинированием масс? Не по теме: У нас с вами, похоже, резко несовпадают часовые пояса...(
0
|
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 12:09 [ТС] | #17 |
0
|
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 12:15 | #18 |
Вообще-то, это та функция, которую я написал. На первой странице, сообщение номер 6, там сначала функция grouping, потом ее вызов из основной программы
0
|
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 12:16 [ТС] | #19 |
У меня для каждой точки задана ее масса и основной целью является найти разбиение точек на два подмножества, чтобы расстояния между центрами тяжести были минимальны. Вот я и подумала, что комбинировать массы проще, чем точки.
Еще можно создать один цикл фор, где просто перебираются точки, как будто шарики из мешка. Но там мне еще посоветовали рэндом засунуть Добавлено через 38 секунд Я помню Ваш код. Эта функция присутствует в языке Си или это как раз и есть рекурсия?
0
|
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 12:26 | #20 |
Это не стандартная функция в языке С, иначе я бы ее не писал. Рекурсия -- это просто прием вызова функцией самой себя. Например:
Функция нахождения факториала числа n: { Если n!=0 Возвращаем n*Факториал(n-1);//Вот он, вызов функции самой из себя. Но нужно этот процесс еще как-то закончить. Если n==0 возвращаем 1;// 0! по определению равен 1 } Просто напишите, чисто логически, как вы это представляете. Если бы нам нужно было выбрать 1 точку, то был бы просто цикл for. Но нам нужно много точек, потому циклом for принципиально можно, но уж очень муторно. ИМХО, плохая идея. Так мы можем и не перебрать все комбинации, либо очень долго их перебирать. Львиную часть времени рендом будет обрабатывать уже пройденые нами варианты.
0
|
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 12:36 [ТС] | #21 |
Я окончательно запуталась
![]()
0
|
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 12:46 | #22 |
Ну так а с чем сложности? Смотри, по действиям:
1) Обьявляем глобальные переменные int* num1 ,int m2 и float dist=0; 2) До мейна вставляем прототип функции grouping.//Не забываем про изменение кода из поста номер 14 3) В мейне вставляем тот второй кусок кода..//Не забываем про изменение кода из поста номер 14 4) Вместо 15 строки в описании функции всталяем: Подсчет расстояний между центрами масс L. Сравнение с dist. Если L больше, чем dist, то dist=L, m2=m, num1=new int[m]; И копируем поэлементно из массива num в массив num1.
0
|
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 12:58 [ТС] | #23 |
UFO94, получается, что номера точек мы берем, как номера строк? Потому что я построчно считываю координаты из файла
0
|
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 13:03 | #24 |
Если у вас файл, где просто в каждой строке записаны координаты одной точки, то да.
Но вам сначала прийдется посчитать количество точек.
0
|
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
||||||
20.05.2012, 13:04 [ТС] | #25 | |||||
UFO94, кол-во точек тоже читается из файла. Вот то, что я пока написала
0
|
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 13:07 | #26 |
Стоп. У вас сколькимерное пространство? o_O
Общий случай, чтоли? В пределе -- 100-мерное? Я уж не говорю о том, что все можно сделать намного рациональнее...
0
|
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 13:09 [ТС] | #27 |
UFO94, трехмерное.
Добавлено через 53 секунды То есть Nmax на 3 заменить?
0
|
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 13:14 | #28 |
Одно из Nmax. Т.е., у вас будет массив [Nmax на 3]
Добавлено через 41 секунду Впрочем, я могу просто переписать этот код, чтобы он стал чуть универсальнее и лучше, и обьяснить. Добавлено через 1 минуту Кстати, а почему бы не сделать массив [Nmax на 4]? 3 координаты + одна масса
0
|
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 13:16 [ТС] | #29 |
UFO94, я просто думала, что разделить на два массива будет удобнее..
0
|
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
|
|||||||||||
20.05.2012, 13:35 | #30 | ||||||||||
Это на самом деле все равно. У статических массивов (те, которые у вас) есть 1 крупный недостаток. Нам должны быть изначально известны их размеры. К чему это ведет в вашей программе? Если у нас будет 101 точка, то последняя просто не прочитается. Если у нас будет 10 точек, то все будет работать, но памяти на это будет затрачено как на 101 точку. По другому обстоит дело с динамическими массивами. Переписанный ваш кусок кода:
Теперь тот же самый код, только с добавлением моей функции:
0
|
20.05.2012, 13:35 | |
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
20.05.2012, 13:35 |
Привет! Вот еще темы с ответами:
30
Реализация разбиения числа с Динам. Прогр - C++ Функция разбиения строки на отдельные слова - C++ Квадрат с вершинами из первого множества накрывает все точки второго множества и имеет минимальную площадь - C++
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |