Efektivní datové struktury: Sets & Maps

Optimalizace kódu v Javě

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Využití prostorové/časové složitosti

Nyní známe prostorovou a časovou složitost!

Jak toto znalosti využít k psaní efektivnějšího kódu?

Volbou správné datové struktury!

Optimalizace kódu v Javě

Systém správy uživatelů

  • Vytváříme systém správy uživatelů

  • Pro dané uživatelské jméno potřebujeme zkontrolovat, zda uživatel existuje

  • Použití seznamu: složitost $O(n)$

public boolean usernameExists(ArrayList<String> users, String newUsername) {
    for (String username : users) {
        if (username.equals(newUsername)) {
            return true;
        }
    }
    return false;
}
Optimalizace kódu v Javě

Sets

  • Kolekce unikátních prvků s rychlým vyhledáváním
  • Průměrná časová složitost $O(1)$ pro přidání, odebrání a kontrolu existence prvku

Vylepšené řešení systému správy uživatelů:

public class UserRegistry {
    private HashSet<String> users = new HashSet<>();

    public boolean userExists(String username) {
        return users.contains(username); // O(1) average time
    }
}
Optimalizace kódu v Javě

Maps

  • Jako slovník: slovo (klíč) -> definice (hodnota)
  • HashMap: průměrná časová složitost $O(1)$ pro operace
public class UserCache {
    private HashMap<String, UserProfile> userProfiles = new HashMap<>();

    public UserProfile getUser(String username) {
        return userProfiles.get(username);  // O(1) average time
    }
}
Optimalizace kódu v Javě

Metoda hashCode

  • Co je činí rychlými -> hashCode()
  • V příkladu s ArrayList jsme neznali index hledaného uživatelského jména
  • Metoda hashcode() převede objekt na index, který lze vyhledat
  • Například pavlos.2020 -> 35189

pavlos.2020 zpracovaný přes hashcode, výsledkem je 35189

Optimalizace kódu v Javě

Indexování prvků

  • HashMap a HashSet mají interní pole
  • Při přidání prvku:
    • Java zavolá hashCode() na prvku a získá celé číslo
    • Provede modulo a určí číslo bucketu

Příklad:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

"optimizingCodeInJava" -> 1406313774 // Implemented by Java
1406313774 % 16 = 14 <- that's our bucket!
Optimalizace kódu v Javě

Kolize

  • Pokud skončí více prvků ve stejném bucketu
    • Nazývá se to kolize
  • Pro bucket se použije LinkedList
  • Proto říkáme $O(1)$ v průměru
Optimalizace kódu v Javě

Poznámka k zapamatování

Výběr datové struktury je jako volba správného nástroje – kladivo (ArrayList) je skvělé na hřebíky, ale na šrouby je lepší použít Set.

Nástroje

Optimalizace kódu v Javě

Pojďme si procvičit!

Optimalizace kódu v Javě

Preparing Video For Download...