-
Data: 2013-09-24 00:53:22
Temat: Re: funkcja haszująca/skrótu
Od: Piotrne <p...@p...onet.pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]W dniu 2013-09-23 22:35, Wojciech Muła pisze:
> No dobra, a dlaczego nie możesz posługiwać się piątką liczb 1..52
> i potraktować je jako cyfry dla systemu liczenia o podstawie 52?
> Wtedy miałbyś od razu indeks do tablicy, kosztem 5 mnożeń i 4 dodawań.
Przypuszczam, z powodem jest 52^5 = 380204032, większe od 2,5 miliona.
> Jeśli to jednak nie przejdzie, to może lepiej rozważ użycie drzew
> trie.
Napisałem funkcję c2num, która wykonuje przekształcenie, o które pytał
autor wątku. W funkcji używane są współczynniki dwumianowe, które
oczywiście można stablicować zamiast liczyć za każdym razem.
Przykład (C) pokazuje przypadek dla n=6, k=2.
long long int bin2int(char *s)
{
long long int res = 0;
while(*s)
{ res = 2 * res + (*s=='1');
s++;
}
return res;
}
/* Współczynnik dwumianowy */
int binom(int n, int k)
{ if ((k==0) || (k==n)) return 1; else return binom(n-1,k-1)+binom(n-1,k); }
/* Wyznaczenie numeru kombinacji zapisanej w C jako ciąg zero-jedynkowy */
int c2num(int n, int k, long long int C)
{
int res;
long long int mask;
mask = 1;
res = 0;
while (k>0 && n>0)
{
n--;
if ((C & mask)==0) res += binom(n,k-1); else k--;
mask <<= 1;
}
return res;
}
int main()
{
printf ("%d\n",c2num(6,2,bin2int("000011")));
printf ("%d\n",c2num(6,2,bin2int("000101")));
printf ("%d\n",c2num(6,2,bin2int("001001")));
printf ("%d\n",c2num(6,2,bin2int("010001")));
printf ("%d\n",c2num(6,2,bin2int("100001")));
printf ("%d\n",c2num(6,2,bin2int("000110")));
printf ("%d\n",c2num(6,2,bin2int("001010")));
printf ("%d\n",c2num(6,2,bin2int("010010")));
printf ("%d\n",c2num(6,2,bin2int("100010")));
printf ("%d\n",c2num(6,2,bin2int("001100")));
printf ("%d\n",c2num(6,2,bin2int("010100")));
printf ("%d\n",c2num(6,2,bin2int("100100")));
printf ("%d\n",c2num(6,2,bin2int("011000")));
printf ("%d\n",c2num(6,2,bin2int("101000")));
printf ("%d\n",c2num(6,2,bin2int("110000")));
return 0;
}
Wynik:
0
1
2
3
4
5
...
14
P.
Następne wpisy z tego wątku
- 24.09.13 06:06 bartekltg
- 24.09.13 14:13 Piotrne
- 25.09.13 07:56 Przemysłąw Dębski
- 25.09.13 12:36 JDX
- 25.09.13 15:05 p...@g...pl
- 25.09.13 17:30 JDX
- 25.09.13 19:01 Ghost
Najnowsze wątki z tej grupy
- Popr. 14. Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
Najnowsze wątki
- 2025-01-22 Gdańsk => System Architect (Java background) <=
- 2025-01-22 Katowice => Senior Field Sales (system ERP) <=
- 2025-01-22 Warszawa => Java Developer <=
- 2025-01-22 pokolenie Z
- 2025-01-22 Wyświtlacz ramki cyfrowej
- 2025-01-22 Białystok => Architekt rozwiązań (doświadczenie w obszarze Java, A
- 2025-01-22 Chrzanów => Team Lead / Tribe Lead FrontEnd <=
- 2025-01-22 Ostrów Wielkopolski => Konsultant Wdrożeniowy Comarch XL/Optima (Ksi
- 2025-01-22 oferta na ubezpieczenie OC życie prywatne
- 2025-01-22 Bieruń => Spedytor Międzynarodowy (handel ładunkami/prowadzenie flo
- 2025-01-22 Warszawa => International Freight Forwarder <=
- 2025-01-22 Gdańsk => Specjalista ds. Sprzedaży <=
- 2025-01-21 Zgromadzenie użytkowników pojazdów :-)
- 2025-01-21 bateria na żądanie
- 2025-01-21 Warszawa => IT Business Analyst <=