Edit # 2:
Dobra, ja spieprzyłem własną pierwszą zasadę - nigdy zoptymalizować przedwcześnie. Najgorszym z tego powodu jest prawdopodobnie użycie programu HashMap o szerokim zakresie - więc właśnie to zrobiłem. Ciągle trwa sekundę, więc zapomnij o wszystkim innym i po prostu to zrób.
Zrobię dla siebie ZALECENIE, aby ZAWSZE przetestować szybkość, zanim zacznę martwić się o skomplikowane implementacje.
(Poniżej jest starszy nieaktualne post, który nadal może być ważne, jeśli ktoś miał o wiele więcej punktów niż milion)
HashSet będzie działać, ale jeśli całkowitymi mają rozsądny zakres (powiedzmy, 1-1000) bardziej wydajne byłoby utworzenie tablicy 1000 liczb całkowitych, a dla każdego ze swoich milionów liczb całkowitych, inkrementacja tego elementu tablicy. (W zasadzie taki sam pomysł jak HashMap, ale zoptymalizowanie kilku niewiadomych, z którymi Hash musi się liczyć, powinno zrobić to kilka razy szybciej).
Można również utworzyć drzewo. Każdy węzeł w drzewie zawierałby (wartość, liczbę), a drzewo byłoby uporządkowane według wartości (niższe wartości po lewej, wyższe po prawej). Przejdź do swojego węzła, jeśli nie istnieje - włóż go - jeśli tak, po prostu zwiększ liczbę.
Zasięg i rozkład wartości określałby, który z tych dwóch (lub zwykły skrót) byłby lepszy. Myślę, że zwykły hash nie miałby wielu "zwycięskich" przypadków (musiałby to być szeroki zakres i "pogrupowane" dane, a nawet wtedy drzewo mogłoby wygrać.)
Ponieważ jest to dość trywialne - I zalecamy wdrożyć więcej niż jedno rozwiązanie i testów prędkości przed rzeczywistego zestawu danych
Edycja. RE komentarzu
TreeMap będzie działać, ale byłoby jeszcze dodać warstwę zadnie (i to tak niezwykle łatwe i przyjemne zaimplementuj siebie) .Jeśli używasz implementacji zasobów, musisz używać liczb całkowitych i stale konwertować do i od int dla każdego wzrostu.Istnieje indirection wskaźnika do Integer i fakt, że przechowujesz na najmniej dwa razy tyle obiektów. To nie uwzględnia nawet żadnych kosztów dla wywołań metod, ponieważ powinny one mieć dowolne szczęście.
Zwykle byłaby to optymalizacja (zła), ale kiedy zaczynasz zbliżać się do setek tysięcy węzłów, czasami musisz zapewnić wydajność, więc wbudowana TreeMap będzie nieefektywna z tych samych powodów, dla których wbudowany program HashSet.
Muszę sprawić, aby był tak wydajny, jak to tylko możliwe. I będzie działać jako część większej aplikacji. –