56 lines
1.5 KiB
Python
56 lines
1.5 KiB
Python
![]() |
class TrieSolmu:
|
||
|
def __init__(self):
|
||
|
self.lapset = {}
|
||
|
self.laskuri = 0
|
||
|
self.todennakoisyys = 0.0
|
||
|
|
||
|
class Trie:
|
||
|
def __init__(self):
|
||
|
self.juuri = TrieSolmu()
|
||
|
self.todennakoisyydet_laskettu = True
|
||
|
|
||
|
def lisaa(self, alkio):
|
||
|
self.todennakoisyydet_laskettu = False
|
||
|
|
||
|
solmu = self.juuri
|
||
|
|
||
|
for x in alkio:
|
||
|
if x not in solmu.lapset:
|
||
|
solmu.lapset[x] = TrieSolmu()
|
||
|
solmu = solmu.lapset[x]
|
||
|
solmu.laskuri += 1
|
||
|
|
||
|
def laske_todennakoisyydet(self):
|
||
|
if self.todennakoisyydet_laskettu:
|
||
|
return
|
||
|
|
||
|
kasiteltavat_solmut = [self.juuri]
|
||
|
|
||
|
while kasiteltavat_solmut:
|
||
|
solmu = kasiteltavat_solmut.pop()
|
||
|
summa = 0
|
||
|
for _, x in solmu.lapset.items():
|
||
|
summa += x.laskuri
|
||
|
kasiteltavat_solmut.append(x)
|
||
|
if summa:
|
||
|
for _, x in solmu.lapset.items():
|
||
|
x.todennakoisyys = x.laskuri / summa
|
||
|
|
||
|
self.todennakoisyydet_laskettu = True
|
||
|
|
||
|
def etsi_seuraavat(self, alkuosa):
|
||
|
if not self.todennakoisyydet_laskettu:
|
||
|
self.laske_todennakoisyydet
|
||
|
|
||
|
solmu = self.juuri
|
||
|
|
||
|
for x in alkuosa:
|
||
|
if x not in solmu.lapset:
|
||
|
return []
|
||
|
solmu = solmu.lapset[x]
|
||
|
|
||
|
vaihtoehdot = []
|
||
|
for x, lapsi in solmu.lapset.items():
|
||
|
vaihtoehdot.append((lapsi.todennakoisyys, x))
|
||
|
return sorted(vaihtoehdot, reverse=True)
|