 |
Ten wątek jest przedawniony Działy Forum » Nauka
| Napisano | Autor | Tytuł | | 24-06-2024 17:18 | alsor (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 pasujeBez 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) | |
|
 | | alsor (3283 punktów) | > Dla małych liczb tzw. enumerative coding jak na slajdzie poniżej ... dla dużych najprościej ANSto raczej nie to o co mi chodzi. tu jest coś o co mi chodziło: en.wikipedia.org/wiki/Combinatorial_number_systemjak 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_familyA 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.
|
|
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 
|
 |
|