Tehtäväsi on toteuttaa luokka, joka pitää yllä listaa luvuista sekä tarjoaa metodin, jolla voidaan laskea tehokkaasti tietyn luvun kaikkien parien etäisyyksien summa listassa.
Esimerkiksi kun lista on , luvun parien etäisyydet ovat:
- kohdat ja : etäisyys
- kohdat ja : etäisyys
- kohdat ja : etäisyys
- kohdat ja : etäisyys
- kohdat ja : etäisyys
- kohdat ja : etäisyys
Tästä tulee etäisyyksien summaksi .
Toteuta tiedostoon distances.py
luokka DistanceTracker
, jossa on seuraavat metodit:
append(number)
: lisää luku listan loppuunsum(number)
: laske yhteen luvun kaikkien parien etäisyydet listassa
Kummankin metodin tulee toimia ajassa .
class DistanceTracker: def __init__(self): # TODO def append(self, number): # TODO def sum(self, number): # TODO if __name__ == "__main__": tracker = DistanceTracker() tracker.append(1) tracker.append(2) tracker.append(1) tracker.append(3) tracker.append(3) tracker.append(1) tracker.append(2) tracker.append(1) print(tracker.sum(1)) # 24 print(tracker.sum(2)) # 5 print(tracker.sum(3)) # 1 tracker.append(1) tracker.append(2) tracker.append(3) print(tracker.sum(1)) # 42 print(tracker.sum(2)) # 16 print(tracker.sum(3)) # 14
Jos lukua ei esiinny listalla tai se esiintyy vain kerran, haluttu tulos on :
tracker = DistanceTracker() print(tracker.sum(1)) # 0 tracker.append(1) print(tracker.sum(1)) # 0
Voit tutkia ratkaisusi tehokkuutta seuraavan testin avulla. Tässäkin tapauksessa koodin tulisi antaa vastaus välittömästi.
tracker = DistanceTracker() total = 0 for i in range(10**5): tracker.append(1) total += tracker.sum(1) print(total) # 4166749999583325000