The RationalistSkip to content
numerowanie kombinacji

This plot has expired

Sections of Forum » Nauka
Date of addingAuthorTitle
24-06-2024 17:18alsor (3312 points)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?
Author can remove replies violating regulations or out of topic.

Murdoch_13 (1467 points)
W Pythonie mamy taka funkcje:



otrzymujemy

tablica[index] = para

.
alsor (3312 points)
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 points)
No to juz prosto, fukcja .index()

np.

tab.index((3, 5))

zwraca indeks z tablicy lub rzuca wyjatek jesli zadna wartosc nie pasuje
alsor (3312 points)
>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 points)
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 (3312 points)
>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 points)
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.

Back to the list of plots działu Nauka 
To write in this plot, you have to sign in


 


[ Cooperation ] [ Advertise ] [ Map of the site ] [ F.A.Q. ] [ Store ] [ Sign up ] [ Contact ]
The Rationalist © Copyright 2000-2018 (English section of Polish Racjonalista.pl)
The Polish Association of Rationalists (PSR)