Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Jestli tomu správně rozumím, tak k je velikost vektoru B, resp. C. V tom případě budeš postupně číst jednotlivé prvky matice. Ke každému prvku najdeš ve vektoru B jeho výskyt, pokud existuje. Zapamatuješ si index h hledaného prvku ve vektoru B a inkrementuješ hodnotu C[h]. Je to takovy primocary postup. Nevím jestli to jde rychleji, asi ano, ale na úkor prostoru.
pseudokod by vypadal takto:
for(h=0;h<k;h++) C[h]=0; // inicializace vektoru cetnosti
for(i=0;i<m;i++) {
for(j=0;j<n;j++) {
for(h=0;h<k;h++) {
if(A[i,j]==B[h]) C[h] = C[h]+1;
break;
}
}
}Offline
Určitě by šlo pole B setřídit - tím klesne časová složitost od faktoru ".k" k faktoru .log(k). Ovšem je nutné zvážit i další okolnosti - pokud např. pro všechna i,j,k bude A[i,j] = B[k], pak bude složitost (asymptoticky) stejná jako algoritmu marikacz.
... ovšem pokud bude m.n < log(k), nemá asymptoticky smysl pole B třídit (pokud neobsahuje hodnoty z malého rozsahu, na které by bylo možno aplikovat radixsort)
Offline