Racjonalista - Strona głównaDo treści
numerowanie kombinacji

Ten wątek jest przedawniony

Działy Forum » Nauka
NapisanoAutorTytuł
24-06-2024 17:18alsor (3283 punktów)numerowanie kombinacji
Potrzebuję sekwencyjnie czytać kolejne kombinacje 2, 3, ... elementowe, czy coś takiego:

2: wtedy mamy (n po 2) = n(n-1)/2 par, które zwyczajnie sobie numeruję: i, j,

np. dla n = 7 mamy 7 po 2 = 7*6/2 = 21 par, czyli:
1,2; 1,3; 1,4, ... 6,7; razem 21 sztuk.

ale ja to potrzebuję liniowo adresować, znaczy:
i,j = nr pary, jedna liczba nie dwie.

3:i to samo dla trójek: i,j,k -> nr/indeks trójki od 1 do (n po 3)
4: ...

ma ktoś takie numery gotowe?
Autor wątku ma uprawnienia do usuwania wypowiedzi, jeżeli łamią regulamin Forum lub znacznie odbiegają od tematu.

Murdoch_13 (1467 punktów)
W Pythonie mamy taka funkcje:



otrzymujemy

tablica[index] = para

.
alsor (3283 punktów)
Mi chodzi o odwrotną operację, czyli tak:

mam daną kombinację, np. 35 dla par,

no i chcę otrzymać numer tej kombinacji - jakby indeks z tej tablicy.

weźmy n=5, czyli elementy 12345, więc pary wyglądają tak:
12 13 14 15 23 24 25 34 35 45 razem 10 sztuk (5*4/2=10);
1--2--3--4--5--6--7--8--9--10 to są indeksy - numery par

zatem ta para 35 ma numer 9.

indeks(3,5) = 9
Murdoch_13 (1467 punktów)
No to juz prosto, fukcja .index()

np.

tab.index((3, 5))

zwraca indeks z tablicy lub rzuca wyjatek jesli zadna wartosc nie pasuje
alsor (3283 punktów)
>No to juz prosto, fukcja .index()
>np.
>tab.index((3, 5))
>zwraca indeks z tablicy lub rzuca wyjatek jesli zadna wartosc nie pasuje

Bez przesady. Taka metoda jest strasznie wolna...

chodzi o bezpośrednie wyliczenie numeru, a nie o wyszukiwanie,

i dla par to jest łatwe bo tam masz taki trójkąt:
12345
.2345
..345
...45

zatem para i,j jest tu łatwa do odgadnięcia:

i - numeruje wiersze - pionowo rośnie, a j idzie poziomo,
więc strzelam:

npary i,j = (n-1)*i / 2 + j;

i sprawdzam: pierwsza para (1,2) ma dać nr 1,

n=5 daje: 4*1 /2 + 2 = 4, zatem za dużo - o 3;
no bo wiadomo: i jest od 1 a j od i+1, więc razem trzeba odjąć 3;
no i jest ok.

npary i,j = (n-1)*i / 2 + j - 3;

sprawdźmy co wyjdzie dla pary 3,5, co ma dać 9:

4*3 / 2 + 5 - 3 = 8

nieprawidłowo - za mało o 1...
Jarek Duda (1185 punktów)
Dla małych liczb tzw. enumerative coding jak na slajdzie poniżej ... dla dużych najprościej ANS ( en.wikipedia.org/wiki/Asymmetric_numeral_systems ), wprowadzenie z prostym kodem: community.wolfram.com/groups/-/m/t/3023601


alsor (3283 punktów)
>Dla małych liczb tzw. enumerative coding jak na slajdzie poniżej ... dla dużych najprościej ANS

to raczej nie to o co mi chodzi.

tu jest coś o co mi chodziło:
en.wikipedia.org/wiki/Combinatorial_number_system

jak widać łatwo numerować kombinacje, bo tu wystarczy formułka typu:

nC(i,j, ...) = 2^i + 2^j + ...

co jest oczywiste: wszystkich kombinacji jest 2^n dokładnie,
zatem to można tak numerować.

wtedy dla par k = 2 otrzymamy:

nP(i,j) = 1 << i + 1 << j;

dla trójek podobnie... dojdzie tylko 1 << k;

nT(i,j,k) = ...

itd.

jak widać nie używamy tu n - liczby elementów.

...........

Tyle że to jest dobre do numerowania kombinacji wszystkich naraz,
a mnie bardziej interesuje numerowanie par,
co tu dałoby zbyt wielkie numery... więcej ramu.

np. dla n = 12 musiałbym używać aż do:
2^12 = 4kB, zamiast:

12 po 2 = 66 B zaledwie!

3:
12 po 3 = 220, nadal dużo mniej od 4k.
Jarek Duda (1185 punktów)
No tak, na jedno wychodzi z enumerative coding który podałem i który historycznie był wcześniej ... mój komentarz z 2021: en.wikiped(*)stem#Enumerative_coding_family

A dla dużych liczb nie ma problemu używając kodowania arytmetycznego czy ANS - w tzw. renormalizacji na bieżąco zrzucają informację na strumień, dzięki temu przetwarzają ułamkowe bity pracując na niewielkim automacie.

Wróć do listy wątków działu Nauka
Aby pisać w tym wątku, musisz się zalogować

  

Zaloguj przez OpenID..
Jeżeli nie jesteś zarejestrowany/a - załóż konto..

Szukaj na Forum  Przewodnik  Regulamin i instrukcja obsługi Forum  Kolegium Moderatorów

 


[ Regulamin publikacji ] [ Bannery ] [ Mapa portalu ] [ Reklama ] [ Sklep ] [ Zarejestruj się ] [ Kontakt ]
Racjonalista © Copyright 2000-2018 (e-mail: redakcja | administrator)
Fundacja Wolnej Myśli, konto bankowe 101140 2017 0000 4002 1048 6365