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
