Upload
tsvetanka-georgieva
View
248
Download
4
Embed Size (px)
Citation preview
ЗАЯВКИ ЗА НАМИРАНЕ НА ПЕРМУТАЦИИ, ВАРИАЦИИ
И КОМБИНАЦИИ
Задача. Да се напише заявка за намиране на:
а) всички пермутации без повторения на n елемента;
б) всички пермутации с повторения на n елемента;
в) всички вариации без повторения на k елемента над n-
елементно множество;
г) всички вариации с повторения на k елемента над n-
елементно множество;
д) всички комбинации без повторения на k елемента над
n-елементно множество;
е) всички комбинации с повторения на k елемента над n-
елементно множество.
22Цветанка Георгиева
ВЪВЕЖДАНЕ НА ЕЛЕМЕНТИТЕ
Нека е дадена таблица itemtable с една колона item:CREATE TABLE itemtable (item varchar(10));
-- въвеждане на елементите
DECLARE @n int;
SET @n=0;
WHILE @n < 6
BEGIN
SET @n = @n + 1;
INSERT INTO itemtable (item)
VALUES (@n);
END;
33Цветанка Георгиева
ПЕРМУТАЦИИ БЕЗ ПОВТОРЕНИЯ
WITH perm (item, level) при @n=3
AS
( SELECT CAST(item AS varchar(50)), 1
FROM itemtable
UNION ALL
SELECT CAST(perm.item + ',' + i.item
AS varchar(50)), level + 1
FROM itemtable i, perm
WHERE level < @n AND
CHARINDEX(i.item, perm.item) = 0 )
-- извеждане на пермутациите
SELECT item
FROM perm
WHERE level = @n
ORDER BY item;
44Цветанка Георгиева
ПЕРМУТАЦИИ БЕЗ ПОВТОРЕНИЯ (2)
Инициализиране, нека @n=3
SELECT CAST(item AS varchar(50)), 1
FROM itemtable
I.SELECT CAST(perm.item + ',' + i.item
AS varchar(50)), level + 1
FROM itemtable i, perm
WHERE level < @n AND
CHARINDEX(i.item, perm.item) = 0 )
Резултатът е празното множество.
55Цветанка Георгиева
ПЕРМУТАЦИИ БЕЗ ПОВТОРЕНИЯ (3)
II.
itemtable perm
×
SELECT CAST(perm.item + ',' + i.item
AS varchar(50)), level + 1
FROM itemtable i, perm
WHERE level < @n AND
CHARINDEX(i.item, perm.item) = 0 )
66Цветанка Георгиева
ПЕРМУТАЦИИ БЕЗ ПОВТОРЕНИЯ (4)
III.
itemtable perm
×
SELECT CAST(perm.item + ',' + i.item
AS varchar(50)), level + 1
FROM itemtable i, perm
WHERE level < @n AND
CHARINDEX(i.item, perm.item) = 0 )
77Цветанка Георгиева
ПЕРМУТАЦИИ БЕЗ ПОВТОРЕНИЯ (5)
IV.
itemtable perm
× Ø
SELECT CAST(perm.item + ',' + i.item
AS varchar(50)), level + 1
FROM itemtable i, perm
WHERE level < @n AND
CHARINDEX(i.item, perm.item) = 0 )
88Цветанка Георгиева
ПЕРМУТАЦИИ С ПОВТОРЕНИЯ
WITH perm (item, level)
AS
( SELECT CAST(item AS varchar(50)), 1
FROM itemtable
UNION ALL
SELECT CAST(perm.item + ',' + i.item
AS varchar(50)),
level + 1
FROM itemtable i, perm
WHERE level < @n
)
-- извеждане на пермутациите
SELECT item
FROM perm
WHERE level = @n
ORDER BY item;
99Цветанка Георгиева
ВАРИАЦИИ БЕЗ ПОВТОРЕНИЯ
DECLARE @k int;
SET @k=2;
-- вариации без повторения
WITH variations (item, level)
AS
( SELECT CAST(item AS varchar(50)), 1 FROM itemtable
UNION ALL
SELECT CAST(v.item + ',' + i.item AS varchar(50)),
level + 1
FROM itemtable i, variations v
WHERE level < @k AND CHARINDEX(i.item, v.item) = 0
)
-- извеждане на вариациите
SELECT item FROM variations
WHERE level=@k
ORDER BY item;
1010Цветанка Георгиева
ВАРИАЦИИ С ПОВТОРЕНИЯ
DECLARE @k int;
SET @k=2;
-- вариации с повторения
WITH variations (item, level)
AS
( SELECT CAST(item AS varchar(50)), 1
FROM itemtable
UNION ALL
SELECT CAST(v.item + ',' + i.item AS varchar(50)),
level + 1
FROM itemtable i, variations v
WHERE level < @k
)
-- извеждане на вариациите
SELECT item FROM variations
WHERE level=@k
ORDER BY item;1111Цветанка Георгиева
КОМБИНАЦИИ БЕЗ ПОВТОРЕНИЯ
DECLARE @k int;
SET @k = 2;
-- комбинации без повторения
WITH comb (item, level) AS
( SELECT CAST(item AS varchar(50)), 1 FROM itemtable
UNION ALL
SELECT CAST(comb.item + ',' + i.item
AS varchar(50)),
level + 1
FROM itemtable i, comb
WHERE level < @k AND i.item>RIGHT(comb.item, 1)
)
-- извеждане на комбинациите
SELECT item FROM comb
WHERE level=@k
ORDER BY item;
1212Цветанка Георгиева
КОМБИНАЦИИ С ПОВТОРЕНИЯ
DECLARE @k int;
SET @k = 2;
-- комбинации с повторения
WITH comb (item, level) AS
( SELECT CAST(item AS varchar(50)), 1 FROM itemtable
UNION ALL
SELECT CAST(comb.item +','+ i.item AS varchar(50)),
level + 1
FROM itemtable i, comb
WHERE level < @k AND i.item>=RIGHT(comb.item, 1)
)
-- извеждане на комбинациите
SELECT item FROM comb
WHERE level=@k
ORDER BY item;
1313Цветанка Георгиева
ЗАЯВКИ ЗА НАМИРАНЕ НА ПЕРМУТАЦИИ, ВАРИАЦИИ
И КОМБИНАЦИИ
Ако n е двуцифрено число:
елементите се въвеждат, като се добавя 0 пред
едноцифрните елементи;
в този случай за комбинациите се използва
RIGHT(comb.item, 2).
Аналогично за трицифрени и т.н. числа.
1414Цветанка Георгиева
1515Цветанка Георгиева
Цветанка Георгиева-Трифонова, 2017
Някои права запазени.
Презентацията е достъпна под лиценз Creative Commons,
Признание-Некомерсиално-Без производни,
https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode