0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
1 | |
Разбиения множества18.05.2012, 19:38. Показов 9092. Ответов 82
Метки нет (Все метки)
Добрый вечер.
У меня есть множество точек в трехмерном пространстве, которые я считала и занесла в двухмерный массив. Задача состоит в том, чтобы рассмотреть все разбиения этого множества на два и сравнить их центры тяжести. Но как сравнить я знаю, а вот как разбить понятия не имею. Например, если у меня три точки, то должно получится три варианта разбиения. Программирую на Си.
0
|
18.05.2012, 19:38 | |
Ответы с готовыми решениями:
82
Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В Множества. Вычислить количество элементов множества Q, связанного c исходными множествами В матрицу записать 1, если удвоенный элемент первого множества меньше элемента второго множества Сформировать два множества, первое из которых содержит все простые числа из заданного множества |
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 12:36 [ТС] | 21 |
0
|
267 / 256 / 23
Регистрация: 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
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 12:58 [ТС] | 23 |
UFO94, получается, что номера точек мы берем, как номера строк? Потому что я построчно считываю координаты из файла
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 13:03 | 24 |
Если у вас файл, где просто в каждой строке записаны координаты одной точки, то да.
Но вам сначала прийдется посчитать количество точек.
0
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
||||||
20.05.2012, 13:04 [ТС] | 25 | |||||
UFO94, кол-во точек тоже читается из файла. Вот то, что я пока написала
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 13:07 | 26 |
Стоп. У вас сколькимерное пространство? o_O
Общий случай, чтоли? В пределе -- 100-мерное? Я уж не говорю о том, что все можно сделать намного рациональнее...
0
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 13:09 [ТС] | 27 |
UFO94, трехмерное.
Добавлено через 53 секунды То есть Nmax на 3 заменить?
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 13:14 | 28 |
Одно из Nmax. Т.е., у вас будет массив [Nmax на 3]
Добавлено через 41 секунду Впрочем, я могу просто переписать этот код, чтобы он стал чуть универсальнее и лучше, и обьяснить. Добавлено через 1 минуту Кстати, а почему бы не сделать массив [Nmax на 4]? 3 координаты + одна масса
0
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 13:16 [ТС] | 29 |
UFO94, я просто думала, что разделить на два массива будет удобнее..
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|||||||||||
20.05.2012, 13:35 | 30 | ||||||||||
Это на самом деле все равно. У статических массивов (те, которые у вас) есть 1 крупный недостаток. Нам должны быть изначально известны их размеры. К чему это ведет в вашей программе? Если у нас будет 101 точка, то последняя просто не прочитается. Если у нас будет 10 точек, то все будет работать, но памяти на это будет затрачено как на 101 точку. По другому обстоит дело с динамическими массивами. Переписанный ваш кусок кода:
Теперь тот же самый код, только с добавлением моей функции:
0
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 13:38 [ТС] | 31 |
Да, я изначально хотела эту функцию брать, только не могла понять, как ее правильно использовать
Добавлено через 1 минуту А вот там, где нужно рассчитать центр тяжести, нужны координаты точек в множестве. Как из извлекать?
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 13:40 | 32 |
Ну так у вас эта функция и была использована....
Координаты точек хранятся в массиве pt(у вас он M). В массиве num лежат только номера точек, которые вошли в 1-ю группу.
0
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 13:44 [ТС] | 33 |
Которые являются номерами строк в двумерном массиве, так?
Добавлено через 1 минуту Еще вопрос: откуда в вашем коде появляется m1?
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 13:50 | 34 |
Да, все правильно.
m1 -- это счетчик уже выбраных точек. Т.е., допустим нам надо выбрать 10 точек. Мы выполняем много раз функцию grouping (ну, она скорее сама себя выполняет), и уже выбрали 4 точки, выбираем 5-ю. Тогда m1=4. При этом первые 4 элемента массива num содержат номера точек, которые мы уже выбрали.
0
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 13:54 [ТС] | 35 |
UFO94, а m тогда что такое?
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 14:04 | 36 |
Полное количество точек, которые нам нужно выбрать. Функция grouping заканчивает считать, когда m1==m. Число m мы перебираем в основной программе от 1 (выбор только одной точки) до, исправьте, не (N+1)/2, а просто N/2, т.е. до половины всего количества точек с округлением вниз. Т.е., если у нас 9 точек, то мы сперва рассмотрим все разбиения 1 на 8 (1 точку выбираем), потом 2 на 7 (выбираем 2 точки), 3 на 6 (выбираем 3 точки), 4 на 5 (выбираем 4 точки). Разбиения 5 на 4, 6 на 3 и т.д. нас не интересуют, потому что они будут повторять разбиения 4 на 5, 3 на 6 и т.д., только выбраные и невыбраные точки поменяются местами.
0
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 14:09 [ТС] | 37 |
А не будет получаться так, что мы будем брать 1 на 8 и первая точка всегда будет первая в списке. Ну то есть по идее мы же должны перебрать все точки и к каждой еще 8 в другой группе собрать, так? Эта функция так делает?
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
|
20.05.2012, 14:24 | 38 |
Эта функция делает так (совсем пошагово):
Хотим выбрать 1 точку, вызываем функцию//Это еще в main ___Функция выбирает точку №1 ___--- сделали свои подсчеты для этого разбиения --- ___Функция выбирает точку №2 ___--- сделали свои подсчеты для этого разбиения --- ___.... ___Функция выбирает точку №9 ___--- сделали свои подсчеты для этого разбиения --- Хотим выбрать 2 точки//опять таки, это еще в мейн ___Функция выбирает первой точкой №1 ______Функция выбирает второй точкой №2 ______--- Подсчеты --- ______Функция выбирает второй точкой №3 ______--- Подсчеты --- ______Функция выбирает второй точкой №4 ______--- Подсчеты --- ______.... ______Функция выбирает второй точкой №9 ______--- Подсчеты --- ___Функция выбирает первой точкой №2 ______Функция выбирает второй точкой №3 ______--- Подсчеты --- ______Функция выбирает второй точкой №4 ______--- Подсчеты --- ______Функция выбирает второй точкой №5 ______--- Подсчеты --- ______.... ______Функция выбирает второй точкой №9 ______--- Подсчеты --- ........ ___Функция выбирает первой точкой №7 ______Функция выбирает второй точкой №8 ______--- Подсчеты --- ______Функция выбирает второй точкой №9 ______--- Подсчеты --- ___Функция выбирает первой точкой №8 ______Функция выбирает второй точкой №9 ______--- Подсчеты --- Хотим выбрать 3 точки ... аналогично.... Хотим выбрать 4 точки ... аналогично ...
0
|
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
|
|
20.05.2012, 14:35 [ТС] | 39 |
Так. Все. Вроде с функцией разобралась. Такой вопрос: как сделать, чтобы он просто вывел это разбиение? Ну чтобы проверить правильно ли работает.
0
|
267 / 256 / 23
Регистрация: 04.04.2012
Сообщений: 546
|
||||||
20.05.2012, 14:53 | 40 | |||||
Там, где я в комментариях поставил кучу !, пишем
0
|
20.05.2012, 14:53 | |
20.05.2012, 14:53 | |
Помогаю со студенческими работами здесь
40
Программа разбиения строк на слова Функция разбиения строки в части [C++] Алгоритм разбиения массива на подмассивы Функция разбиения матрицы на две Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |