Toteutettu alustava implementaatio trie-tietorakenteesta
This commit is contained in:
parent
4900e16b9d
commit
d6da26ea46
2 changed files with 59 additions and 2 deletions
55
src/trie.py
Normal file
55
src/trie.py
Normal file
|
@ -0,0 +1,55 @@
|
|||
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)
|
Reference in a new issue