Kombinacje bez powtórzeń

Użytkowanie arkusza kalkulacyjnego
JedenGość
Posty: 198
Rejestracja: czw mar 07, 2019 6:54 pm

Kombinacje bez powtórzeń

Post autor: JedenGość »

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?
Libre Office 24.8.1.2 / Windows 11
Jan_J
Posty: 4579
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Kombinacje bez powtórzeń

Post autor: Jan_J »

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).

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)
Awatar użytkownika
Rafkus
Posty: 527
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Kombinacje bez powtórzeń

Post autor: Rafkus »

Ciekawy problem, jest tak jak napisał:
Jan_J pisze: pt sty 27, 2023 9:46 pm Nie ma funkcji sortującej, nie ma funkcji filtrującej, nie ma funkcji usuwalącej duplikaty.
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; "")
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.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
JedenGość
Posty: 198
Rejestracja: czw mar 07, 2019 6:54 pm

Re: Kombinacje bez powtórzeń

Post autor: JedenGość »

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.
Libre Office 24.8.1.2 / Windows 11
Jan_J
Posty: 4579
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Kombinacje bez powtórzeń

Post autor: Jan_J »

@Rafkus
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)
Awatar użytkownika
Jermor
Posty: 2352
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Kombinacje bez powtórzeń

Post autor: Jermor »

JedenGość pisze: sob sty 28, 2023 8:37 pm ... zainwestować w jakiś dobry kurs VBA ...
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.
Awatar użytkownika
Rafkus
Posty: 527
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Kombinacje bez powtórzeń

Post autor: Rafkus »

JedenGość pisze: pt sty 27, 2023 8:48 pm A może jest jakieś inne?
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
Lub w postaci macierzowej:

Kod: Zaznacz cały

{=MIN.K(zbiór; {1.2.3.4})}	===>	otrzymamy tablicę: (2.4.4.8)
Zamiast funkcji UNIKATOWE można tutaj posłużyć się formułą macierzową znajdującą unikaty. Sposób jej stworzenia został opisany na blogu: http://przepis-na-lo.pl/2013/11/unikato ... ie-danych/ oraz tutaj. Z moich doświadczeń wynika, że formuła ta dobrze się sprawdza przy niewielkich zbiorach danych. Przy dużych ilościach danych(testowałem ją dla ponad 1000) obciążenie procesora było już odczuwalne. Dlatego też napisałem sobie własną funkcję (proponowałem ją nieco wcześniej).

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
JedenGość
Posty: 198
Rejestracja: czw mar 07, 2019 6:54 pm

Re: Kombinacje bez powtórzeń

Post autor: JedenGość »

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.
Libre Office 24.8.1.2 / Windows 11
ODPOWIEDZ