Kombinacje bez powtórzeń
Kombinacje bez powtórzeń
Próbuję stworzyć formuły podające konkretną LISTĘ wszystkich kombinacji bez powtórzeń.
Przykład: mamy zbiór 8 elementów: A, B, C, D, E, F, G, H.
Ile będzie kombinacji, jakbyśmy chcieli stworzyć mniejsze zbiory składające się z 3 elementów, np.
ABC
ABD
ABE
itd.
funkcja KOMBINACJE(8;3) daje szybką odpowiedź, że tych kombinacji będzie 56.
Ok. Tylko, że ja potrzebuję pełną listę ABC, ABD, itd.
Znalazłem ciekawy filmik na youtubie:
https://www.youtube.com/watch?v=KTS4vY0 ... xcel.iAdam
Trochę to wszystko skomplikowane, ale ogarniam. Jest tylko inny problem.
W LO CALC nie widzę funkcji FILTRUJ, SORTUJ, UNIKATOWE. Są, czy ich nie ma?
Bez nich to rozwiązanie nie ma racji bytu.
A może jest jakieś inne?
Przykład: mamy zbiór 8 elementów: A, B, C, D, E, F, G, H.
Ile będzie kombinacji, jakbyśmy chcieli stworzyć mniejsze zbiory składające się z 3 elementów, np.
ABC
ABD
ABE
itd.
funkcja KOMBINACJE(8;3) daje szybką odpowiedź, że tych kombinacji będzie 56.
Ok. Tylko, że ja potrzebuję pełną listę ABC, ABD, itd.
Znalazłem ciekawy filmik na youtubie:
https://www.youtube.com/watch?v=KTS4vY0 ... xcel.iAdam
Trochę to wszystko skomplikowane, ale ogarniam. Jest tylko inny problem.
W LO CALC nie widzę funkcji FILTRUJ, SORTUJ, UNIKATOWE. Są, czy ich nie ma?
Bez nich to rozwiązanie nie ma racji bytu.
A może jest jakieś inne?
Libre Office 24.8.1.2 / Windows 11
Re: Kombinacje bez powtórzeń
Nie ma funkcji sortującej, nie ma funkcji filtrującej, nie ma funkcji usuwalącej duplikaty.
Są operacje edycyjne (menu) umożliwiające ich przeprowadzenie.
Wypisanie wszystkich kombinacji jest zadaniem o rozwiązaniu rekurencyjnym. Liczba kombinacji k-elementowych z puli n-elementowej wynosi (n po k) = n! / (k! (n-k)!). To jest liczba PODZBIORÓW; jeśli zależy Ci na liczbie ciągów, musisz to pomnożyć przez liczbę możliwych ustawień, czyli k! n! / (k! (n-k)!) = n! / (n-k)! = n (n-1) ... (n-k+1). W kombinatoryce taki ciąg nazywa się wariacją.
Włączanie do biblioteki funkcji generatora ciągu ciągów (tak!) o tej długości nie jest pierwszą potrzebą. Uważam prywatnie, że w innych arkuszach pojawiła się ona raczej jako element wojny marketingowej, niż jako odpowiedź na realne zapotrzebowanie.
Natomiast jak najbardziej da się to opisać funkcją programistyczną; w Calcu: makrem. Tego
https://stackoverflow.com/questions/464 ... s-elements
da się użyć wprost w makrze Calca (choć wymaga to pewnej wprawy). Natomiast bez makra, interpretator Pythona masz dostępny bez instalacji online np. w w3schools.
Bezpośrednio podzbiory te (nie ciągi) konstruowałbym następująco. Przykład dotyczy kombinacji (nie wariacji) 8 po 3, ale zasada jest ogólna i łatwo się programuje. Powyższe odwołania do stackoverflow dają rybę (funkcję generującą podobny efekt) a nie wędkę (oprogramowanie pomysłu).
Są operacje edycyjne (menu) umożliwiające ich przeprowadzenie.
Wypisanie wszystkich kombinacji jest zadaniem o rozwiązaniu rekurencyjnym. Liczba kombinacji k-elementowych z puli n-elementowej wynosi (n po k) = n! / (k! (n-k)!). To jest liczba PODZBIORÓW; jeśli zależy Ci na liczbie ciągów, musisz to pomnożyć przez liczbę możliwych ustawień, czyli k! n! / (k! (n-k)!) = n! / (n-k)! = n (n-1) ... (n-k+1). W kombinatoryce taki ciąg nazywa się wariacją.
Włączanie do biblioteki funkcji generatora ciągu ciągów (tak!) o tej długości nie jest pierwszą potrzebą. Uważam prywatnie, że w innych arkuszach pojawiła się ona raczej jako element wojny marketingowej, niż jako odpowiedź na realne zapotrzebowanie.
Natomiast jak najbardziej da się to opisać funkcją programistyczną; w Calcu: makrem. Tego
https://stackoverflow.com/questions/464 ... s-elements
da się użyć wprost w makrze Calca (choć wymaga to pewnej wprawy). Natomiast bez makra, interpretator Pythona masz dostępny bez instalacji online np. w w3schools.
Bezpośrednio podzbiory te (nie ciągi) konstruowałbym następująco. Przykład dotyczy kombinacji (nie wariacji) 8 po 3, ale zasada jest ogólna i łatwo się programuje. Powyższe odwołania do stackoverflow dają rybę (funkcję generującą podobny efekt) a nie wędkę (oprogramowanie pomysłu).
Kod: Zaznacz cały
z puli 8 (ABCDEFGH) wybieram 3
ABCDEFGH
00000000
wybieram pierwszy element
10000000
01000000
00100000
00010000
00001000
00000100 dalej nie ma sensu bo nie będzie się dało wybrać dwu innych
Teraz dla każdego z pierwszych wybranych wybieram drugi element:
12000000
10200000
10020000
10002000
10000200
10000020
01200000
01020000
01002000
01000200
01000020
00120000
00102000
00100200
00100020
00012000
00010200
00010020
00001200
00001020
00000120
W trzecim kroku dla każdego z wariantów ustalę możliwe pozycje trzeciego elementu. Nie chce mi się tego pisać.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Kombinacje bez powtórzeń
Ciekawy problem, jest tak jak napisał:
Nawiązuję do 15 minuty i 54 sekundy tamtego filmiku.
PS. https://www.youtube.com/watch?v=BSrcMDVTDZ4 <--- Dalsza część "twojego" filmiku w którym pisze własne procedury do wypisana wszystkich wariacji i kombinacji.
Co do funkcji UNIKATOWE to zapraszam tutaj: funkcja UNIKALNE, z jej fragmentu można by zrobić funkcję SORTUJĄCĄ... Zamiast funkcji filtrującej dałoby radę radę wykorzystać ponownie funkcję UNIKALNE w mniej więcej taki sposób:
Kod: Zaznacz cały
= UNIKALNE(JEŻELI( (kolumnaE<>kolumnaF)*(kolumnaE<>kolumnaG)*(kolumnaF<>kolumnaG); kolumnaH; "")
PS. https://www.youtube.com/watch?v=BSrcMDVTDZ4 <--- Dalsza część "twojego" filmiku w którym pisze własne procedury do wypisana wszystkich wariacji i kombinacji.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Kombinacje bez powtórzeń
Panowie, dziękuję za podpowiedzi.
Niestety nie znam się na makrach i VBA. Miałem nadzieję, że można to ogarnąć zwykłymi formułami.
Pozostaje mi zajrzeć na Udemy i zainwestować w jakiś dobry kurs VBA i Pythona.
Niestety nie znam się na makrach i VBA. Miałem nadzieję, że można to ogarnąć zwykłymi formułami.
Pozostaje mi zajrzeć na Udemy i zainwestować w jakiś dobry kurs VBA i Pythona.
Libre Office 24.8.1.2 / Windows 11
Re: Kombinacje bez powtórzeń
@Rafkus
miałem na myśli jedynie standardowe funkcje w bibliotece.
miałem na myśli jedynie standardowe funkcje w bibliotece.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Kombinacje bez powtórzeń
Jeśli pracujesz z LibreOffice albo Apache OpenOffice, to musisz wiedzieć, że Basic (taki sam) dla tych pakietów różni się od VBA (Visual Basic for Application) dla pakietu Microsoftu. Główne różnice dotyczą dostępu do danych w dokumentach.
O tym, jak napisać własne funkcje w Basicu naszego forum napisałem tu: https://yestok.pl/lbo/y61.php a nieco więcej o Basicu, tu: https://yestok.pl/lbo/y64.php. Może się przyda?
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Re: Kombinacje bez powtórzeń
Zamiast funkcji SORTUJ do poukładania wartości od najmniejszej do największej można by wykorzystać funkcję MIN.K, ale uwaga: jest ona przeznaczona tylko dla LICZB. Dlatego zamiana LICZB na LITERY musiałaby się odbyć dopiero po "posortowaniu" pierwszych wyników. Załóżmy, że mamy zbiór liczb: 8; 4; 4; 2. W wyniku działania tej funkcji otrzymamy:
Kod: Zaznacz cały
=MIN.K(zbiór; 1) ===> 2
=MIN.K(zbiór; 2) ===> 4
=MIN.K(zbiór; 3) ===> 4
=MIN.K(zbiór; 4) ===> 8
=MIN.K(zbiór; 5) ===> błąd, bo zbiór ma tylko 4 elementy
Kod: Zaznacz cały
{=MIN.K(zbiór; {1.2.3.4})} ===> otrzymamy tablicę: (2.4.4.8)
Zamiast funkcji FILTRUJĄCEJ, to również można wykorzystać formułę wyszukującą unikaty.
W dołączonym pliku, bazując na pokazanym filmie, przedstawiam to samo rozwiązanie ale wykorzystując przedstawione dostępne funkcje - BEZ MAKR. Wyniki są widoczne tylko w LibreOffice, ze względu na funkcję łączącą tekst w pewnym zakresie, której to nie ma w AOO. Przy odrobinie chęci, można je dostosować do AOO.
- Załączniki
-
- Wariacje.ods
- (23.53 KiB) Pobrany 87 razy
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Kombinacje bez powtórzeń
Jermor, dziękuję za linki do Twoich artykułów. Ta lektura na pewno się przyda. Co do excela, to nie widzę problemu, aby pracować na tym oprogramowaniu. Do LO skłania mnie to forum i pomoc, jaką na nim uzyskałem / uzyskuję.
Rafkus, dziękuję za Twoją solucję. Powoli ją ogarniam. Prawdopodobnie będzie przydatna.
Rafkus, dziękuję za Twoją solucję. Powoli ją ogarniam. Prawdopodobnie będzie przydatna.
Libre Office 24.8.1.2 / Windows 11