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 [1,2,1,3,3,1,2,1], luvun 1 parien etäisyydet ovat:
- kohdat 0 ja 2: etäisyys 2
- kohdat 0 ja 5: etäisyys 5
- kohdat 0 ja 7: etäisyys 7
- kohdat 2 ja 5: etäisyys 3
- kohdat 2 ja 7: etäisyys 5
- kohdat 5 ja 7: etäisyys 2
Tästä tulee etäisyyksien summaksi 2+5+7+3+5+2=24.
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 O(1).
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 0:
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