powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Поиск любых сочетаний из К чисел
25 сообщений из 206, страница 6 из 9
Поиск любых сочетаний из К чисел
    #39713800
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TСхематично вывод делается так
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function print_bit(value) {
  mask = 1 << K;
  while(mask != 0) {
     if((value & mask) == 0) {
         print("0");
     } else {
         print("1");
     }
     mask = mask >> 1;
}

Тогда можно будет определить все сочетания для К объектов.Так?
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
// K – количество чисел (объектов).				
var P = new Array(K+1);				
// количество сочетаний				
var K1=1;				
for(var i = 1; i <=K; i++) K1=K1*2;				
K1=K1-1;				
// поиск всех сочетаний для К объектов				
for(var i = 0; i <= K1; i++) {				
	for(var i = 1; i <= K; i++) P[i]=0;			
	sochet_new(i);			
}				
				
				
function sochet_new(i) {				
	var i1=0;			
	mask = 1 << i;			
	while(mask != 0) {			
		i1=i1+1;		
		P[i1]=value & mask;		
	}			
	mask = mask >> 1;			
}				

Есть одно сомнение: для число 1 в массиве Р "1" находится в начале массива или в конце?
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39713887
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то я намудрил в предыдущем сообщении. Теперь кажется верно:
Код: javascript
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.
28.
29.
// K – количество чисел (объектов).					
var P = new Array(K+1);					
// количество сочетаний					
var K1=1;					
for(var k = 1; k <=K; k++) K1=K1*2;					
K1=K1-1;					
var dlina1=1;					
var dlina2=1;					
// поиск всех сочетаний для К объектов					
for(var k1 = 0; k1 <= K1; k1++) {					
	for(var k = 1; k <= K; k++) P[k]=0;				
	if (k1>dlina1) {				
		dlina1=dlina1*2;			
		dlina2=dlina2+1;			
	}				
	sochet_new(k1, dlina2);
	// печать сочетания P[K]			
}					
					
					
function sochet_new(value, dlina2) {					
	var i1=0;				
	mask = 1 << dlina2;				
	while(mask != 0) {				
		i1=i1+1;			
		P[i1]=value & mask;			
	}				
	mask = mask >> 1;				
}
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714055
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovЧто-то я намудрил в предыдущем сообщении. Теперь кажется верно:
Тут тоже намудрил, это надо внутрь цикла, иначе он будет бесконечный
Код: sql
1.
	mask = mask >> 1;				



И это под вопросом:
Код: sql
1.
		P[i1]=value & mask;			


value & mask дает или 0, или mask, выше ты 0 и 1 использовал, не знаю важно ли это для твоей задачи.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714062
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TТут тоже намудрил, это надо внутрь цикла, иначе он будет бесконечный
Код: sql
1.
	mask = mask >> 1;	

И это под вопросом:
Код: sql
1.
		P[i1]=value & mask;	

value & mask дает или 0, или mask, выше ты 0 и 1 использовал, не знаю важно ли это для твоей задачи.Спасибо! Понял. Теперь так?
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function sochet_new(value, dlina2) {					
	var i1=0;				
	mask = 1 << dlina2;				
	while(mask != 0) {				
		i1=i1+1;			
		if((value & mask) == 0) {			
			P[i1]=0;		
		} else {			
			P[i1]=1;		
		}			
		mask = mask >> 1;			
	}				
}
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714515
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В сообщениях 21696995 и 21697400 представлена программа по поиску всех сочетаний К чисел.
Однако, если величина К окажется слишком большой, например, 200, 250, то в программе появляются большие числа: 2^200, 2^250, что приводит к необходимости вводить дополнительные программы для работы с такими большими числами.

В сообщениях 21697951 и 21698205 высказана мысль о переходе в программах, где есть большие числа, на другие числа, например, на величину степени 2 таких чисел.

Однако выше указанная программа, которая основывается на программе 21690391 , предполагает разложение чисел вида 2^200 на отдельные биты, что не позволяет избавиться от больших чисел.

Поэтому попробуем представить другую программу поиска сочетаний без использования больших чисел.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714669
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в этой программе не требуется использовать большие числа:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
// K – количество чисел (объектов).				
var P = new Array(K+2);				
for(var i = 1; i <= K+1; i++) P[i]=0;				
				
while (P[К+1]< 1) {				
	SOCHET3(K, P);			
	// печать сочетания			
	for(var i = 1; i <= K; i++) print(P[i]);			
}				
				
function SOCHET3(K, P)  {				
	var i1;  			
	i1=1;			
D:				
	P[i1]=P[i1]+1;			
	if (P[i1] == 2) {			
		P[i1] = 0;		
		i1=i1+1;		
		go to D;		
	}			
 // получаем сочетание P[K]				
} 

Так что, получаем все сочетания. Где-то помогла картинка 21281836
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714671
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy Usov,

Так и не смог избавится от go to?
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714673
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonGennadiy Usov,

Так и не смог избавится от go to?
mayton, он только учится программировать, пока хоть так, потом почитает правила хорошего тона.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714677
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonGennadiy Usov,

Так и не смог избавится от go to?Пока не вижу альтернативы
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714738
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovmaytonGennadiy Usov,

Так и не смог избавится от go to?Пока не вижу альтернативы
Альтернатива это цикл и break
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function SOCHET3(K, P)  {				
	var i1;  			
	i1=1;			
	while(true) {
		P[i1]=P[i1]+1;			
		if (P[i1] != 2) break; // Выход из цикла если P[i1] != 2
		P[i1] = 0;		
		i1=i1+1;		
	}
}


Но в этом коде есть ошибка: i1 может выйти за пределы размера массива P[], поэтому лучше так
Код: javascript
1.
2.
3.
4.
5.
6.
7.
function SOCHET3(K, P)  {				
	for(var i1 = 1; i1 <=K; i1++) {
		P[i1]=P[i1]+1;			
		if (P[i1] != 2) break; // Выход из цикла если P[i1] != 2
		P[i1] = 0;		
	}
}
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714948
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за 2 варианта программ!
Dima TНо в этом коде есть ошибка: i1 может выйти за пределы размера массива P[], поэтому лучше так
Код: javascript
1.
2.
3.
4.
5.
6.
7.
function SOCHET3(K, P)  {				
	for(var i1 = 1; i1 <=K; i1++) {
		P[i1]=P[i1]+1;			
		if (P[i1] != 2) break; // Выход из цикла если P[i1] != 2
		P[i1] = 0;		
	}
}

Данный вариант очень интересен с точки зрения упрощения программы.

Однако, все сочетания определяются в некотором цикле от 1 до ..... Процедура SOCHET3 будет в этом цикле.
Последним сочетанием должно быть 1111111111 и т.д. А цикл будет работать дальше.

Поэтому необходимо ввести ячейку P[К+1]. И пусть i1 выходит за пределы размера массива P[К], где мы 1 отловим в ячейке P[К+1].

Поэтому мне очень понравился 1-ый вариант. Никогда не работал со значениями true, поэтому спасибо за учение. Кстати, true можно применить и в оболочке над SOCHET3
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
			
// K – количество чисел (объектов).			
var P = new Array(K+2);			
for(var i = 1; i <= K+1; i++) P[i]=0;			
			
while(true) {			
	SOCHET3(K, P);		
	if (P[К+1]==1) break; // Выход из цикла по сочетаниям		
	// применение сочетаний
        // печать сочетания		
	for(var i = 1; i <= K; i++) print(P[i]);		
}			
			
function SOCHET3(K, P)  {			
	var i1;  		
	i1=1;		
	while(true) {		
		P[i1]=P[i1]+1;	
		if (P[i1] != 2) break; // Выход из цикла если P[i1] != 2	
		P[i1] = 0;	
		i1=i1+1;	
	}		
}
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714964
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovОднако, все сочетания определяются в некотором цикле от 1 до ..... Процедура SOCHET3 будет в этом цикле.
Последним сочетанием должно быть 1111111111 и т.д. А цикл будет работать дальше.

Поэтому необходимо ввести ячейку P[К+1]. И пусть i1 выходит за пределы размера массива P[К], где мы 1 отловим в ячейке P[К+1]
Вот мы уже плавно подошли к теме обработки ошибок. Отлавливать ошибку в P[К+1] не самый красивый способ.
Лучше выбрать какое-то правило для обработки ошибок и его использовать. Например функция возвращает true в случае успешного выполнения.
В этом случае можно так
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
function SOCHET3(K, P)  {				
	var i1;
	for(i1 = 1; i1 <=K; i1++) {
		P[i1]=P[i1]+1;			
		if (P[i1] != 2) break; // Выход из цикла если P[i1] != 2
		P[i1] = 0;		
	}
        return i1 <= K;
}



тогда вывод можно будет переписать так
Код: javascript
1.
2.
3.
4.
while(SOCHET3(K, P)) {			
        // печать сочетания		
	for(var i = 1; i <= K; i++) print(P[i]);		
}			



PS Советую сделать паузу и прочитать какую-нибудь книгу по основам программирования.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39714994
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T Например функция возвращает true в случае успешного выполнения.
В этом случае можно так
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
function SOCHET3(K, P)  {				
	var i1;
	for(i1 = 1; i1 <=K; i1++) {
		P[i1]=P[i1]+1;			
		if (P[i1] != 2) break; // Выход из цикла если P[i1] != 2
		P[i1] = 0;		
	}
        return i1 <= K;
}

тогда вывод можно будет переписать так
Код: javascript
1.
2.
3.
4.
while(SOCHET3(K, P)) {			
        // печать сочетания		
	for(var i = 1; i <= K; i++) print(P[i]);		
}			


PS Советую сделать паузу и прочитать какую-нибудь книгу по основам программирования.Пока некогда делать паузу.

Надо подвести некоторую черту.
Что мы имеем:
- вариант программы определения сочетаний для большого числа К 21699386 (на основании картинок 21281836 );
- вариант программы определения сочетаний для небольшого числа К 21696770 21697400 с использованием идеи 21690391 .

Кому что нравится.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39715091
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что от нас требуется?
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39715127
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЧто от нас требуется?Да ничего
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39716883
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gennadiy UsovНадо подвести некоторую черту.
Что мы имеем:
- вариант программы определения сочетаний для большого числа К 21699386 (на основании картинок 21281836 );
- вариант программы определения сочетаний для небольшого числа К 21696770 21697400 с использованием идеи 21690391 .В первом варианте, как правило, перебираются "1" только в части двоичного вида числа, определяющего сочетание.

Во втором варианте маски перебирают все элементы двоичного вида числа, определяющего сочетание.

В первом варианте можно значительно уменьшить количество переборов, если массив P[K] разделим на несколько частей, и "работаем" отдельно с каждой частью.

Например, число К делится на 3. Тогда получаем программу (используем вариант 21699436 , предложенный Dima T):
Код: javascript
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.
28.
29.
30.
31.
// K – количество чисел (объектов).					
var P = new Array(K+1);					
for(var i = 1; i <= K; i++) P[i]=0;					
					
var K1=K/3;					
P[1] = -1;
P[K1+1] = -1;					
P[2*K1+1] = -1;					
					
var K2=0;					
var K3=2*K1;					
while(SOCHET4(K1, P, K2)) {					
	while(SOCHET4(K1, P, K3)) {				
		while(SOCHET4(K1, P, K1)) {			
			
			// печать сочетания		
			for(var i = 1; i <= K; i++) print(P[i]);		
			}		
		}			
	}				
}					
					
function SOCHET4(K1, P, i2)  {					
	var i1;				
	for(i1 = i2+1; i1 <=i2+K1; i1++) {				
		P[i1]=P[i1]+1;			
		if (P[i1] != 2) break; // Выход из цикла если P[i1] != 2			
		P[i1] = 0;			
	}				
	return i1 <= i2+K1;				
}					
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717044
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В предыдущем сообщении массив P[K] был разделе на 3 равные части , и в каждой его части искались свои сочетания, а потом все эти сочетания совмещались в одно сочетание.

Оказывается, такое разделение (произвольное) можно сделать для любого массива P[K]. Таким образом, можно уйти от больших чисел.

Например, надо найти сочетания для 100 чисел.

Делим массив P[100] на 4 части, например, 15, 35, 27, 23. Тогда, используя результаты сообщения 21702893 , получаем программу поиска сочетаний для 100 чисел:
Код: javascript
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.
28.
var K=100;							
var P = new Array(K+1);							
for(var i = 1; i <= K; i++) P[i]=0;							
							
var K1=15;							
var K2=35;							
var K3=27;							
var K4=23;							
var Q1=0;							
var Q2= 15;							
var Q3=50;							
var Q4=77;							
P[1] = -1;							
P[15+1] = -1;							
P[50+1] = -1;							
P[77+1] = -1;							
							
while(SOCHET4(K1, P, Q1)) {							
	while(SOCHET4(K2, P, Q2)) {						
		while(SOCHET4(K3, P, Q3)) {					
			while(SOCHET4(K4, P, Q4)) {				
				// печать сочетания			
				for(var i = 1; i <= K; i++) print(P[i]);			
				}			
			}				
		}					
	}						
}	

Правда, первое сочетание будет состоять из одних 0, но пока от этого не удаётся избавиться.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717110
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В двух последних сообщениях 21702893 и 21703238 лишняя закрывающая скобка } в головной программе.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717111
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот кусок кода имеет рекурсивную природу. Убежден что его можно переписать на более компактный вид.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
while(SOCHET4(K1, P, Q1)) {							
	while(SOCHET4(K2, P, Q2)) {						
		while(SOCHET4(K3, P, Q3)) {					
			while(SOCHET4(K4, P, Q4)) {				
				// печать сочетания			
				for(var i = 1; i <= K; i++) print(P[i]);			
				}			
			}				
		}					
	}						
}	
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717114
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЭтот кусок кода имеет рекурсивную природу. Убежден что его можно переписать на более компактный вид.Возможно.

Однако, не всегда в таких программах будет одна и та же процедура.
Весь смысл такой разбивки не только в том, чтобы уйти от больших чисел.

Могут быть процедуры, которые будут решать специальные задачи на отдельных участках массива P[K]. Например, сравнение с другими участками.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717188
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А теперь можно вернуться к одной из задач по специальным сочетаниям: 21283022
«Имеется несколько последовательностей чисел: 1,2,3, далее 1,2,3,4,5,6, далее 1,2,3,4,5,6,7,8,9, и т.д.
Для каждой нужно найти все сочетания. При этом:
В первой последовательности в одном сочетании не могут быть 1 и 2, 2 и 3, во второй - 1 и 3, 2 и 4, 3 и 5, 4 и 6, в третьей - 1 и 4, 2 и 5, 3 и 6, 4 и 7, 5 и 8, 6 и 9 и т.д.
Здесь видно, что существует некоторая прогрессия, которую можно распространить на последовательность, длиной 3 х К.
Вот и все.»

Можно взять программу 21702893 и добавить к ней процедуру SOCHET5, которая сравнивает значения «1» в 3-х разделах массива P[K].
Код: javascript
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.
28.
29.
30.
31.
32.
33.
34.
35.
// K – количество чисел (объектов).						
var P = new Array(K+1);						
for(var i = 1; i <= K; i++) P[i]=0;						
						
var K1=K/3;						
P[K1+1] = -1;						
P[2*K1+1] = -1;						
P[1] = -1;						
						
var K2=0;						
var K3=2*K1						
while(SOCHET4(K1, P, K2)) {						
	while(SOCHET4(K1, P, K3)) {					
		while(SOCHET5(K1, P, K1)) {				
			// печать сочетания			
			for(var i = 1; i <= K; i++) print(P[i]);			
		}				
	}					
}						
						
function SOCHET5(K1, P, i2)  {						
	var i1;					
	for(i1 = i2+1; i1 <=i2+K1; i1++) {					
		P[i1]=P[i1]+1;				
		if(P[i1] == 1)  {				
			if((P[i1 - K1] == 1) || (P[i1 + K1] == 1)) {			
				P[i1]=2;		
				for(var i = i2+1; i <= i1-1; i++) P[i]=0;		
			}			
		}				
		if (P[i1] != 2) break; // Выход из цикла если P[i1] != 2				
		P[i1] = 0;				
	}					
	return i1 <= i2+K1;					
}						
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717268
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно цикл WHILE имеет обязывает программиста реализовать следующий паттерн:

Код: java
1.
2.
3.
4.
5.
<инициализация>
while(<условие цикла>) {
   <тело цикла>
   <итерационное выражение>
}



Если вы опускаете итерационное выражение то рискуете получить бесконечный цикл. Теоретически
это выражение может быть инкапсулировано в функцию условия но в вашем случае - есть сомнения
что это реализовано.
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717275
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, 21699386
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717276
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, вы тестировали это?
...
Рейтинг: 0 / 0
Поиск любых сочетаний из К чисел
    #39717280
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может оно и работает. ХЗ. Но эти функции с глобальным состоянием. Это ... unsupportable. Зачем так вообще делать?
...
Рейтинг: 0 / 0
25 сообщений из 206, страница 6 из 9
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Поиск любых сочетаний из К чисел
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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