powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / найти все подмножества
11 сообщений из 11, страница 1 из 1
найти все подмножества
    #35700579
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Необходимо из bit varying получить все подмножества с единицами. Например:
было
01011
подмножества будут следующие:
01011
00011
01001
01010
00001
00010
01000
01000
00000

Может кто видит решение, кроме как написание функции с рекурсией.
Если видит подскажите какое.

Спасибо.
...
Рейтинг: 0 / 0
найти все подмножества
    #35700750
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то закономерность вхождения элемента в "подмножество с единицами" не ясна...
именно, что значит "подмножество с единицами" ?
...
Рейтинг: 0 / 0
найти все подмножества
    #35701490
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_,

Ниче непонял. Может что-то типа этого?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION "public"."a_bitmask" (integer) RETURNS SETOF integer AS
$body$
DECLARE
    tnBitMask	INT4 := Coalesce($ 1 ,  0 ) ;
    lnMaxNmb	INT4 ;
    lnCnter	INT4 ;
BEGIN
    lnMaxNmb := ( 1  << ceiling(ln(tnBitMask)/ln( 2 ))::Int4) -  1  ; 
    FOR lnCnter IN  0  .. lnMaxNmb LOOP
    	RETURN NEXT lnCnter & tnBitMask ;
    END LOOP ;	
    RETURN ;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
Код: plaintext
1.
2.
3.
select distinct src
from a_bitmask( 11 ::int4) src
order by  1  ;
...
Рейтинг: 0 / 0
найти все подмножества
    #35703531
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо откликнувшимся
Виноват...
Попробую еще раз:
В моем случае
необходимо найти такие значение в которых для любой единицы найдется соотвествующая единица в заданной строке.
Как опять не понятно...пример пусть задано 101, тогда "подмножестваами" будут
101
001
100
000
...
Рейтинг: 0 / 0
найти все подмножества
    #35703574
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select distinct generate_series(0,'10110'::bit(5)::integer)::bit(5) & '10110'::bit(5);
...
Рейтинг: 0 / 0
найти все подмножества
    #35703683
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBatselect distinct generate_series(0,'10110'::bit(5)::integer)::bit(5) & '10110'::bit(5);

Красиво и просто!!!
Жаль у меня используется огромный размер - не влазиит в INT
...
Рейтинг: 0 / 0
найти все подмножества
    #35703705
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо что менять в логике
...
Рейтинг: 0 / 0
найти все подмножества
    #35704990
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_Жаль у меня используется огромный размер - не влазиит в INTgenerate_series есть и над bigint.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
=> \df generate_series
                              List of functions
   Schema   |      Name       | Result data type |    Argument data types
------------+-----------------+------------------+---------------------------
 pg_catalog | generate_series | setof bigint     | bigint, bigint
 pg_catalog | generate_series | setof bigint     | bigint, bigint, bigint
 pg_catalog | generate_series | setof integer    | integer, integer
 pg_catalog | generate_series | setof integer    | integer, integer, integer
( 4  rows)

однако если в десятичном виде не влезает в int, то сколько же знаков содержит двоичная запись, больше 32?

Gold_надо что менять в логикевозможно. имхо, задача странная.
...
Рейтинг: 0 / 0
найти все подмножества
    #35705079
gp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
безотносительно PostgreSQL,

задача сводится к перечислению целых от 1 до 2^N-1, где N - колличество ненулевых бит в аргументе.
Дальше нужно вставить нули обратно.

X = 01011
N = 111

1 - 001 -> 0001
2 - 010 -> 0010
3 - 011 -> 0011
4 - 100 -> 1000
5 - 101 -> 1001
6 - 110 -> 1010
7 - 111 -> 1011
...
Рейтинг: 0 / 0
найти все подмножества
    #35705163
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpбезотносительно PostgreSQL,

задача сводится к перечислению целых от 1 до 2^N-1, где N - колличество ненулевых бит в аргументе.
Дальше нужно вставить нули обратно.

X = 01011
N = 111

1 - 001 -> 0001
2 - 010 -> 0010
3 - 011 -> 0011
4 - 100 -> 1000
5 - 101 -> 1001
6 - 110 -> 1010
7 - 111 -> 1011а еще можно утверждать, что задача сводится к вычислению списка битых ("ненулевых") битов
для
01011
это

01000
00010
00001

и комбинированию их (рекурсивно или в цикле)
скажем: внешний цикл по глубине комбинаций от 1 до числа битых (N, здесь N=3)
внутри - (двоичный т. FOR i=0 TO 1) цикл выборки невыбранных еще в комбинацию битых. вычислительно это видимо попроще, чем свертка исходного числа с полным набором вариантов.

зы автор правда разбавляет это множество нулем 00000. оно ему надо.
...
Рейтинг: 0 / 0
найти все подмножества
    #35708975
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!!
Сделал так:
Код: plaintext
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.
36.
37.
38.
39.
CREATE OR REPLACE FUNCTION dlm.get_label_sub_set(bit varying)
  RETURNS SETOF bit varying AS
$BODY$
DECLARE
	lI_pos		INT;
	lBV_label	bit varying;
	lBV_label_pos	bit varying;
	result 		bit varying;
	_rec		RECORD;
BEGIN
	DROP TABLE  IF EXISTS get_label_sub_set_result;
	CREATE TEMP TABLE get_label_sub_set_result AS SELECT '0'::label_theme_big as lb;
	lBV_label = $ 1 ;
	lBV_label_pos  = lBV_label;
	lI_pos = position('1' IN lBV_label);
	IF lI_pos >  0  THEN
		INSERT INTO get_label_sub_set_result VALUES ('1'::label_theme_big >> lI_pos- 1 );
	END IF;
	
	WHILE lI_pos >  0 
	LOOP
		lBV_label_pos =lBV_label_pos#('1'::label_theme_big >> lI_pos- 1 );
		lI_pos = position('1' IN lBV_label_pos);
		IF lI_pos >  0 
		THEN
			lBV_label = '1'::label_theme_big >> lI_pos- 1 ;
			INSERT INTO get_label_sub_set_result SELECT lb | lBV_label FROM get_label_sub_set_result;
		ELSE EXIT;
		END IF;
	END LOOP;
	
	FOR result IN SELECT  lb FROM get_label_sub_set_result
		LOOP 
			RETURN NEXT result;
		END LOOP;
	RETURN;
END;
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE STRICT;

label_theme_big это домен например такой
Код: plaintext
1.
2.
3.
CREATE DOMAIN label_theme_big
  AS bit( 500 );
ALTER DOMAIN label_theme_big OWNER TO postgres;

Нормально использовать времянки так, как я понял, можно с версии 8.3
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / найти все подмножества
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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