Page 1 of 1

Trie

Posted: Thu Sep 16, 2010 7:49 pm
by idle
Trie structure, to stores a dictionary and option value
http://en.wikipedia.org/wiki/Trie

edited, bug fix

uses
Search for a list of words from a given root
Auto complete
Spell Checker
Store keys / values pairs

The Enum function is a bit convoluted and could be improved, if someone can do it, please do
Also probably needs a remove function too

Code: Select all

;Trie, Stores a dictionay with an optional value for each entry
;see http://en.wikipedia.org/wiki/Trie


;mTrie.clsTree = NewTrie(@mTrie)
;mTrie\Add("someword",value=1)
;mTrie\LookUp("someword")  returns the key Value or 0
;mTrie\Enum("wordroot",@MyTrieCallBack()) returns all the words under the root 
;mTrie\Free() ;releases the memory

;Note for Enum you need to declare a callback function
;Procedure MyTreeCallBack(*item)
; Debug PeekS(*item)   
;EndProcedure   

;Things to do
;Sort out the Enum function, it's a bit messy 
;Add a remove function

Structure edge
   edge.i[256] 
EndStructure

Structure TrieNode;
   Value.i;
   Count.i;
   Vertex.edge
EndStructure;

Structure Trie
  *vt.i
  *root.TrieNode;
EndStructure;

Declare FreeNodes(*node.TrieNode)
Declare NewTrie(*obj.Trie)
Declare FreeTrie(*this.Trie)
Declare AddTrie(*this.Trie,key.s,value.i=1)
Declare lookupTrie(*this.Trie,key.s)
Declare iEnumTrie(*this.Trie,*node.TrieNode,key.s,*fn)
Declare EnumTrie(*this.Trie,key.s,*fn.i)

Interface clsTrie
  Free()
  Add(key.s,item.i=1)
  LookUp(key.s)
  Enum(key.s,*fn.i)
EndInterface   


Procedure FreeNodes(*node.TrieNode)
  ;Free all Trie Nodes
  Protected a.i
   If Not *node
      ProcedureReturn;
   EndIf
   
   For a=0 To 255
      FreeNodes(*node\Vertex\edge[a]);
   Next
   
   If *node
     FreeMemory(*node)
   EndIf 
   
EndProcedure

Procedure NewTrie(*obj.Trie)
  *obj = AllocateMemory(SizeOf(Trie))
  If *obj
   *obj\vt=?vt_Trie
  EndIf
  *obj\root = AllocateMemory(SizeOf(TrieNode))
 
  ProcedureReturn *obj
EndProcedure

Procedure FreeTrie(*this.Trie)
  ;free the Trie
  FreeNodes(*this\root)
  FreeMemory(*this)
 
EndProcedure

Procedure AddTrie(*this.Trie,key.s,value.i=1)
  ;Add item to the Trie, value is optional
  Protected *tnode.TrieNode,*node.TrieNode,len.i,tkey.i,lkey.i,pos.i
  len = Len(key)
   lkey.i
   
   If Not len
     ProcedureReturn;
   EndIf

   *node = *this\root;
   
   While pos < Len+1
    
     tkey = PeekB(@key+pos) & $FF
    
     If Not *node          
      *node = AllocateMemory(SizeOf(TrieNode))
        *tnode\Vertex\edge[lkey] = *node
      EndIf

      *node\count + 1
        
     If pos = len 
       *node\value = value
      EndIf
      
      *tnode = *node
      *node = *node\Vertex\edge[tkey]
      lkey = tkey
      pos+1
      
   Wend
   
EndProcedure

Procedure lookupTrie(*this.Trie,key.s)
  ;Find the value of the key returns the value or 0
  Protected *node.TrieNode,*bkey.byte,result.i   
    
  *node = *this\root
  *bkey = @key 
  *node = *node\Vertex\edge[*bkey\b & $FF]
 
  While *bkey\b <> 0 
   
      If Not *node
         ProcedureReturn 0
      EndIf
      *bkey+1
      result = *node\value
      *node = *node\Vertex\edge[*bkey\b & $FF]
      
   Wend
   
   ProcedureReturn result
   
EndProcedure

Procedure iEnumTrie(*this.Trie,*node.TrieNode,key.s,*fn)
  ;internal Enum trie 
  Protected a.i,tkey.s
 
  If Not *node
      ProcedureReturn;
   EndIf
   
   ;build the key   
   For a=0 To 255
     If *node\Vertex\edge[a]
       tkey = key + Chr(a)
       iEnumTrie(*this,*node\Vertex\edge[a],tkey,*fn);
     Else
       tkey = key
     EndIf 
   Next
   
   ;lookup the key
   If lookupTrie(*this,tkey)
     CallFunctionFast(*fn,@tkey)
     key=tkey
     ProcedureReturn *node
   EndIf   
      
EndProcedure

Procedure EnumTrie(*this.Trie,key.s,*fn.i)
  ;enumerate all the entries below given root key
  Protected *node.TrieNode,*tnode.TrieNode,tkey.i,len.i,pos.i
 
  *node = *this\root;
  tkey = PeekB(@key) & $FF;
  len = Len(key)
  *node = *node\Vertex\edge[tkey]
 
  ;find the root   
  While *node
   
    If *node
       *tnode =*node
     EndIf
    
     pos+1
     tkey = PeekB(@key+pos) & $FF
     *node = *node\Vertex\edge[tkey]
        
   Wend
   ;enum the root
   While *tnode
    
     *tnode = iEnumTrie(*this,*tnode,key,*fn)
     tkey = PeekB(@key+pos) & $FF
    
     If *tnode
      *tnode = *tnode\Vertex\edge[tkey]
     EndIf   
    
   Wend
   
EndProcedure

DataSection: vt_Trie:
  Data.i @FreeTrie()
  Data.i @AddTrie()
  Data.i @lookupTrie()
  Data.i @EnumTrie()
EndDataSection   


;Test code_____________________________________________________________________ 

Procedure MyTreeCallBack(*item)
   
  Debug PeekS(*item)   
  
EndProcedure   

Global mt.clsTrie = NewTrie(@mt) 

mt\Add("a",1)
mt\Add("abba",2)
mt\Add("abracadabbra",3)
mt\Add("ant",4)
mt\Add("and",5)
mt\Add("andy",6)    
mt\Add("andrew",7)
mt\Add("andrews",8)
mt\Add("bob",9)
mt\Add("bobo",10)
mt\Add("bobob",11)

Debug mt\LookUp("andy")

mt\Enum("ab",@MyTreeCallBack())

mt\Free()


Re: Trie

Posted: Fri Sep 17, 2010 11:54 am
by Seymour Clufley
Thanks for this, Idle.

I wish we could speed it up somehow. I loaded a few thousand words into it and a native PB map retrieved elements faster than the trie. It's a shame after the effort you put in.

But thank you. You've been very good to me with this code (and others)!

Re: Trie

Posted: Sat Sep 18, 2010 12:16 am
by idle
Thanks, I don't think there's much that can be done to make it faster, maybe it's a paging issue due to the size of the nodes.

The map lookup is really quick though it's hard to compare in this way as they're two different things.

Code: Select all

Procedure lookupTrie(*this.Trie,key.s)
  ;Find the value of the key returns the value or 0
  Protected *node.TrieNode,*bkey.byte,result.i   
   
  *node = *this\root
  *bkey = @key
  *node = *node\Vertex\edge[*bkey\b]

  While *bkey\b <> 0
   
      If Not *node
         ProcedureReturn 0
      EndIf
      *bkey+1
      result = *node\value
      *node = *node\Vertex\edge[*bkey\b]
     
   Wend
   
   ProcedureReturn result
   
EndProcedure

Re: Trie

Posted: Sat Sep 18, 2010 5:26 pm
by pthien
Couldn't this code be the basis for a small ISAM lib?

Re: Trie

Posted: Sun Sep 19, 2010 9:47 pm
by idle
I suppose it could, though you'd need to implement lists in the nodes to store pointers to the records for identical keys and change the edge array dimension to suit the key type eg numeric strings edges[10]. It will still use more memory than a BTree but it's lookup and insert should be faster.

Re: Trie

Posted: Fri Sep 24, 2010 9:34 pm
by idle
example with a ~1000 dictionary

Code: Select all

;Test code_____________________________________________________________________
Global result.s 
Procedure MyTreeCallBack(*item)
   
  result + PeekS(*item) + " "   
 
EndProcedure   

Global mt.clsTrie = NewTrie(@mt)
*Mem = AllocateMemory(13053)
UnpackMemory(?wordlist_Start,*Mem)

While a < 13053
  tv = PeekB(*mem+a) & $FF
  If tv = 10
  a+1
  tword.s = PeekS(*mem+la,(a-la)-1)
  mt\Add(tWord,Len(tword))
  ;Debug tword 
  la=a
  EndIf
  a+1
Wend   

FreeMemory(*mem)

Global benum 
InitMouse()

If OpenConsole()
  PrintN("Enter a word hit enter to check against dictionary")
  PrintN("hold left mouse button and hit enter to get a list of words")
  PrintN("type quit To End")
  Repeat
    ClearConsole()
    str$ = Input()
    
    If GetAsyncKeyState_(#VK_LBUTTON) & 1
      benum = 1 
      Debug "mouse"
    EndIf   
    
    If benum 
      mt\Enum(str$,@MyTreeCallBack())
      PrintN(result)
      result = ""
      benum = 0 
    ElseIf str$ <> ""
      If mt\LookUp(str$)
       PrintN("Words in dictionary " + str$)
      ElseIf str$ <> "quit"
        PrintN("I don't know that word add it to dictionary [y/n]?")
        If Input() = "y"
          mt\Add(str$,Len(Str$))
        EndIf
      EndIf
    EndIf     
    Delay(20)
  Until str$ = "quit"

EndIf

mt\Free()

DataSection
WordList_Start:
Data.l  $32FD434A,$3CB90000,$6BEC85F2,$6DC02005,$5F4A72F6,$B7F600C7,$75015B24,$41B08C72,$60F8372F,$CA6E1FEB
Data.l  $14740877,$09408168,$200FA05C,$701060E7,$E3E98807,$FCE86D13,$5CBC0190,$6C893004,$B38C468C,$176179CE
Data.l  $29BB0D03,$41504050,$22A7B605,$C1DE1D9D,$4C06B848,$D0B032E2,$8D2026C5,$418EB0EE,$09B20A88,$C971F01D
Data.l  $B0919D07,$860D8A79,$60601412,$C0249603,$CE4311CE,$8268DE10,$854A4D26,$4274025B,$108C6DB0,$84048137
Data.l  $65811A60,$7E1C7E63,$3B1D28BB,$01176032,$3446478B,$C2642EF1,$130BD537,$56802D14,$0D2700E8,$74B0D35A
Data.l  $7A30304B,$84D354A0,$C06C4855,$1419BC08,$FA44401B,$74FAE247,$713AAB94,$C81480B8,$D2A30F0E,$403DB410
Data.l  $04664321,$780633D0,$686D0D23,$F2EA06E0,$04230DB9,$C8650EA3,$2BB44442,$CEF14116,$85430226,$0D34838A
Data.l  $05136320,$307C6219,$4C134C0F,$C053309B,$4A6A2980,$63B4B603,$6E458076,$E0555C54,$0D993BED,$12201B05
Data.l  $80218394,$D041B50F,$90EAF00B,$1454E651,$C527526F,$073B961F,$A4A60D86,$208049F0,$05467229,$11C62050
Data.l  $EC17E89F,$DEF00AC2,$F780C066,$5EFB5371,$2A77AF3F,$98015A9B,$0910A01A,$B1D02DE5,$4079A0D0,$4BB0683B
Data.l  $21436721,$9BE69374,$0A0B3B7D,$C0428618,$18DFA83C,$1B20A472,$032050DD,$6DD7E632,$015AD2D5,$B88CB038
Data.l  $8B766368,$D971ADE0,$59AAC094,$1829B01F,$D8D8581D,$A26A0158,$B017353C,$245F0161,$0BD45128,$0B89936C
Data.l  $34525E50,$2DF2A812,$B0E42DE0,$D1B4864F,$C285A0C9,$0F6CD586,$B2C216D8,$8126F080,$80EE70D2,$7512D006
Data.l  $E582E864,$E007021D,$005FA096,$07D426D9,$242A6FA8,$5D1CB960,$88CB266A,$1C4027C4,$0243028E,$4A4341D0
Data.l  $BA503003,$3872C033,$D013F067,$30A408A6,$1D25F7B5,$0242F405,$65E0997E,$2018FBA3,$60291F5B,$44542F1C
Data.l  $226CB6B1,$808107D8,$FDC21040,$6CB8B9CD,$10E0A1BA,$60E48F94,$401215D9,$01E001AE,$91AD787C,$10C0FC69
Data.l  $02CDD9C0,$B80E7228,$C950D303,$9DF27780,$5DB27816,$3ADE61DC,$03B82260,$219B7806,$1CDB112A,$C406AA28
Data.l  $05D8C057,$E6990E08,$32C52E04,$71280A07,$305B500C,$A434B6C0,$00AD6D13,$18921E46,$CA82ED14,$12924137
Data.l  $6379D990,$82E1DA60,$7836EF51,$9CC05130,$81274DB7,$9301C059,$C016500A,$F0DF1725,$9DA0E9EE,$A585E602
Data.l  $2EE1B20D,$86724E90,$82A2DE52,$61DA6402,$0F0504F0,$902433EB,$4015047B,$113A94B9,$40200426,$142816BB
Data.l  $6021538B,$ED32943E,$C022E946,$061B15DD,$1B6A342A,$75374B4E,$798010A1,$E1D998B8,$9C03C749,$5D2330B5
Data.l  $05B73D4A,$B52955A3,$60AA4819,$2F0ABC04,$053CC3E7,$FA13D5CC,$27077CC3,$0047C5D4,$6EF18982,$198DED15
Data.l  $99A76EEB,$A049A513,$C406425D,$8540C2E4,$C6B00E76,$229974E3,$0148200B,$4980C803,$6848120A,$B0814BBC
Data.l  $18198084,$2C0F8BA8,$13860A43,$7BEB0377,$7E4CE805,$CB232E4A,$6EC51686,$A8001201,$643A8825,$04BC2853
Data.l  $8040E2DC,$44D8CD1C,$D602181B,$0D631C72,$40326142,$10086A4F,$9AC249B7,$224E567C,$2CA104F6,$A5826320
Data.l  $5B034C7B,$60164E50,$C69C6581,$82C71B0E,$868515A2,$097600FD,$DEFE2B98,$1015C902,$B9E0C386,$D3F87100
Data.l  $C0659B30,$D05C6453,$49C2B670,$8ADEB16C,$C5122C52,$1EEA5079,$8BAAAE50,$12EF5125,$8A4955B0,$BB4A084A
Data.l  $3068D80B,$A39C59C0,$480FC34A,$5C0206C7,$A25C126A,$C9F84EA0,$7FA44765,$E46F5680,$760808DB,$6078A402
Data.l  $54E91413,$05B51181,$7098514E,$976346F3,$0486FD01,$A8548F28,$36044257,$106E5EA9,$5AB4ED6F,$50260C82
Data.l  $337868C2,$D0868117,$44304045,$81D8DA33,$80F01074,$0AC00C77,$A900771B,$45B51B72,$A0139490,$54A3F8CE
Data.l  $1B3834B8,$71B56A30,$A6090407,$8044AFE0,$00D2DDD3,$600AA2F2,$33CCA4B8,$3C1CD924,$C5B00383,$AA638105
Data.l  $68D102BC,$A58EB185,$811B818E,$5E631982,$C06402AE,$394D0D62,$2AD238CA,$90021013,$BEA48CA1,$634C01E3
Data.l  $E803004C,$98B86E98,$0297A59B,$19153671,$C24C6008,$A38BA7A0,$12B40C28,$AB725DA7,$18094434,$4E7E8498
Data.l  $7A9A25B8,$E568B0F1,$5CD801A1,$EB7D2453,$60220173,$7719F393,$94EAF78F,$E05865EE,$93C2517A,$D21D6414
Data.l  $0F1EF2A6,$7A28585A,$1C995096,$34DD5C5A,$08C2BA58,$A75326C1,$A01F29BE,$2DD00169,$D0C01903,$60C1804B
Data.l  $88D1C3A7,$A01029CC,$4E14C35F,$0389F1B0,$C5C01363,$1660DC03,$CDB95DC9,$E281981F,$AE252500,$9415401D
Data.l  $E65686FA,$2902C043,$FB647C98,$3A319CCE,$14E96012,$0998E017,$EA616148,$A471BCEB,$028E38D1,$01DC6516
Data.l  $15619365,$C6683F4C,$0F5A40B2,$CD0D033D,$2D842304,$850437B3,$19CA3B78,$E7020183,$160349A8,$8DA0876C
Data.l  $D0C16723,$BB88382F,$19EFAB09,$4331A054,$258E60B9,$C71D82E5,$C72EB64B,$AE5C460D,$5D8303A2,$76072C07
Data.l  $3040AE8D,$F8510AF1,$F17A2463,$6D8C8E51,$A60B6084,$8D1625C2,$1818287C,$8AA89D06,$8A86526D,$01750C38
Data.l  $5E308D18,$EC1405A0,$10002CBB,$30B6DDEC,$45C5F374,$FA4080C1,$0DD5D806,$18DB7B90,$98269380,$60225043
Data.l  $32C06C83,$A8008CBA,$F0103AED,$4032F2D3,$C679BB42,$AEB5794F,$074BAC01,$F001C3A8,$38879946,$6E9B56B9
Data.l  $A0B84CC8,$008F4166,$72300AF3,$3572474B,$52A01076,$F8380667,$F42C1CE8,$31BE8777,$8B93EE80,$E018A846
Data.l  $C822F291,$F4727780,$2A2200A8,$034200D7,$2482C8A8,$602B6C04,$80B30BA3,$A65C8BF0,$DD08F610,$62C34C05
Data.l  $4006E026,$BC05B14E,$28F3C21B,$02805878,$01377C03,$7530B202,$100A40FC,$AE3058D9,$BB006E39,$BD1784FD
Data.l  $05F6EF10,$602A68E0,$4C105620,$A1F409C3,$A1BA0B6B,$815A03C2,$75198863,$C54D2606,$10C86537,$6B9FB403
Data.l  $778A2A0A,$E542E00C,$5F6C29A6,$9A0DE044,$A40806B9,$0D42007F,$F3B0D840,$4ED3618A,$86170702,$300CC090
Data.l  $AE38429F,$17201C76,$418E9AD2,$F3653458,$00B31A02,$A2D31B97,$080B74E3,$75F5016F,$8E120DE0,$AB3428BF
Data.l  $9D8D402A,$59AE4500,$C6C9C19C,$4972322B,$483AEE84,$24E7C024,$1D675B4C,$C0214404,$BEDED50A,$60C9EC03
Data.l  $730C4017,$CD08BE4D,$D14C12CB,$1332C1A8,$A883BD98,$39C003FC,$05573854,$250B93B4,$B012A3C6,$00D1BE18
Data.l  $8774B522,$175E5607,$80F1A2C7,$D808C054,$782A3548,$3C9C0AF5,$09BF9C10,$0C03765D,$47E94CCC,$0077E170
Data.l  $DE6359A5,$74FDA805,$96081822,$263D430B,$23B5030D,$FCD0EB01,$0A569CE0,$10128804,$0D63CBC0,$DF6275AB
Data.l  $7F310532,$1561C5E7,$D514C606,$C5089809,$5230234B,$4EB15153,$616629C0,$1DBAF301,$F401AC36,$ED90A7C8
Data.l  $5E3755A2,$195C2710,$884F04C0,$80CAE70C,$C0587816,$CA75A886,$02C7A401,$8D606576,$D0C1A3E6,$2AE52B35
Data.l  $34732C22,$5FCA58AD,$08AE6FAB,$302E6EA0,$D0077DA1,$C92F5704,$18BB0B29,$113B5B30,$D0C86FA0,$EC663FCB
Data.l  $00AF51DA,$E1EBA1E7,$6B363140,$F94616E3,$12682166,$487ED78E,$53A01434,$A06A8E3A,$72010E81,$1092A948
Data.l  $559C2718,$D1DBD71B,$2261A59D,$3E354603,$4A2A42B8,$0CC60CA1,$C268158D,$AAC646ED,$ED760515,$8F09DDCE
Data.l  $E602F48B,$FADEA5EB,$29E85266,$D404CF40,$361C38F4,$91039BC6,$E80CBE41,$C709915C,$5D00B32A,$A0BCB8A9
Data.l  $5B88ABE5,$70061101,$7E3E2010,$01116150,$E37AA9BB,$CE40607A,$10324601,$01701208,$EB6CE8E3,$D0DBE4DB
Data.l  $DA333660,$109204B6,$03E06220,$080A29BC,$60A0B050,$E172ED3B,$0D6B1004,$212AAC0F,$00557E9B,$AB472086
Data.l  $6282E690,$D4ECA162,$1DD7581F,$019D6019,$5BFA4E84,$AF60A017,$BA360221,$A1268011,$5F23C05D,$60F00E3B
Data.l  $161C2025,$1040B0CD,$183C234A,$41F39DD8,$14A52480,$701D48E5,$D3A551DE,$BBFB00A4,$8554A404,$49B4A643
Data.l  $4B877017,$768002A3,$D0B68011,$0067AF59,$9A495CC5,$A0A9BC04,$52F8B8CB,$01A0AB1A,$03E2E1E9,$0D26B5EB
Data.l  $2CD85D5B,$D002CC13,$A9408061,$5442469D,$AB9022DB,$535B8089,$1745C180,$AB003E02,$3016F430,$8B634B78
Data.l  $DCD7BB52,$ED24C325,$16063875,$8D2A01EE,$2CAE1E1E,$137164C0,$050A6BA0,$57C0313C,$59E8E790,$7BAC0A79
Data.l  $9618EA6A,$A005D1C5,$0A370917,$E8F9CFA0,$295D75D5,$1E60AC60,$087892E1,$BAA9A3BC,$1037CC00,$8723E901
Data.l  $69C02AD1,$DB5803CB,$C72C525D,$804201D0,$E403BDEA,$C42C06AA,$3F1C00EA,$6F93044B,$4E02AC10,$701E4678
Data.l  $80892ECD,$00757EFC,$60265E28,$F8195C67,$AAE7E82A,$0F1A1657,$3A2B9A10,$02E2D62A,$BA80E2E8,$9E0E6AED
Data.l  $6C0930FD,$28647076,$3AE3729A,$014107DA,$06C1D8DE,$DC01FD16,$2016601C,$04A75516,$01CEE3D7,$5070C674
Data.l  $48B1A0A2,$573F0155,$B734E206,$E4360DAE,$DBCFE025,$C157035C,$03E2C2A8,$2E2D4813,$9011BD2B,$6BF74B81
Data.l  $AB39726C,$0172B048,$492D860D,$D0B59C50,$C033FE00,$60392F3F,$5DADD62C,$171ACC03,$45A20887,$1B51A699
Data.l  $817B8DB0,$C064C180,$38A91601,$30225960,$2B9A0E8B,$DC6FB9E3,$83F48804,$046902C6,$01DE9BE6,$0217CB16
Data.l  $19EDC04D,$4038A140,$1B040F82,$260A702B,$2EE25780,$03CF6E90,$32C0EA2C,$90117300,$04AEA386,$0381B4FC
Data.l  $03941EA3,$BCC594DA,$2BB08804,$301498A8,$2A03BA0F,$17A07713,$041363B2,$9D6A2EE1,$04A24E70,$DB31E264
Data.l  $4A763CFD,$A286A805,$80E42304,$DCE8D305,$805B3CAE,$18427408,$40158F6D,$96665F10,$6BE5E85D,$5E26FB43
Data.l  $B8B8B4EA,$7F3AD81B,$0D8600E0,$4A758FB0,$1A629180,$0494A4A0,$B58743B4,$AD212F6E,$D0EA50BB,$56288041
Data.l  $92470620,$F180F28A,$0188800F,$E04C8347,$75050300,$F337051B,$B922717E,$239A4274,$B41C8B0E,$04A0D018
Data.l  $F71CD953,$49504B3C,$94060220,$56604A60,$1705D0C5,$D2B8375C,$DBA094BE,$AA003E8A,$185F16AD,$02ACD845
Data.l  $D9648963,$095EC176,$25E553BC,$687EE6C0,$FDC0E8E3,$4C170332,$99D04AE7,$9D0DCBF7,$2A7D3EC6,$BC0AE0BA
Data.l  $6DD669EB,$8399F880,$813E3B97,$B4FC8382,$5F83B061,$EB819785,$3948D0D0,$06AC4090,$914401CB,$35DE6583
Data.l  $29019870,$F806ECC0,$B166654B,$34B3010C,$85C32202,$2808AC80,$4BADA4A7,$A9D4F324,$203CB893,$C0A71860
Data.l  $4200A3E1,$E7A85CAD,$E11CEF2B,$6BB603BC,$1896041C,$94CAA068,$02BB1A85,$5C0D96E8,$9860E05E,$DA02F989
Data.l  $C18661D9,$3B8052C9,$9747068F,$480F35DE,$75780A77,$AA571203,$425BEE30,$8980DB21,$068A8C04,$AF95A728
Data.l  $ED802080,$5BDC4008,$74AFB74A,$943588C2,$428A1880,$1381CA9D,$4018A8C1,$6D3691C3,$99800F3D,$069C859B
Data.l  $75627B6C,$57B22C00,$77063005,$0F0D004E,$435C00BD,$B5747686,$30022210,$00B00380,$6285AA67,$E1E403AE
Data.l  $1AE3B6DD,$807301E0,$A50C76B2,$CC089093,$CA86042A,$E1176421,$9B8E4EF9,$6A085CA3,$BB38594A,$5C93FBB5
Data.l  $016E3B1C,$50064019,$178B57C7,$A8A10240,$A0DC8173,$6DEE00DB,$B6D4AD47,$0D80132E,$5C4A757C,$7E52641C
Data.l  $1F638091,$F95636DF,$50AF6680,$AAE91C00,$EAEC59B0,$C190DCEF,$AA6401C3,$3A8AA278,$8FC68DC5,$7780A802
Data.l  $9002300F,$4802ABB7,$2E5DCB8D,$A86C8DA6,$336E0062,$DC051409,$42A9D149,$7CD12677,$14014B34,$F0C2956E
Data.l  $65635ECD,$8D607739,$78A6515C,$59CE25E9,$D30F0207,$042001DD,$3C4BB26C,$C3A8E454,$52A0009A,$0BC4038E
Data.l  $77750E81,$FBA85014,$5197820E,$DA01080D,$D25B537C,$0BAED2C0,$802A70B8,$01B697C1,$35397246,$44027616
Data.l  $15BA57EB,$E9D79605,$B219A026,$62200160,$113E13AF,$1EAE1692,$458CC605,$81721419,$AC44E2BC,$F20078F2
Data.l  $E974CEB2,$9142C9B0,$10A88700,$AA0041AD,$D60637BD,$C7D0AED9,$96010369,$28036C8C,$64B31180,$2E355D60
Data.l  $02CF7A17,$780ACA82,$8F42A6CF,$C061EE3E,$84ECEC1E,$96F3C2A2,$10BC3A00,$E1E05E20,$62F02808,$6D622A59
Data.l  $010A3E0A,$E2CC2CBF,$DEC8E304,$A3E105AA,$4557043D,$1C51C40E,$55252520,$56B2C4F0,$F0AC900A,$2AE18139
Data.l  $66440150,$60191D17,$C7A07662,$CACB6BA9,$221DD3ED,$68055A40,$A8482B96,$8048ABE6,$871015F9,$80F839CB
Data.l  $DB0A6A75,$F378DC14,$BBF96543,$4EC007F8,$06B8008C,$01D57394,$290B588C,$06A7ADA0,$3D3B9321,$F0123C03
Data.l  $C0F0CE9E,$9808F520,$E074BBAF,$A32C043D,$8030DED8,$A65DBE58,$B8F72580,$8AA4B418,$46C92A5B,$A0120828
Data.l  $00AF3E68,$641328F8,$A1B27BB4,$0E63E6CC,$36BAAF39,$02408E86,$03A0E132,$79604A95,$52BE1D51,$A0943CDA
Data.l  $04AF01DE,$E2122BB8,$C803CAD2,$8EB12EDF,$23E46C1C,$54C2CCC1,$A4083230,$94DF6752,$8E2C2E22,$43D0BCF9
Data.l  $04045280,$63C7F5E4,$EF01DD18,$1F751828,$4750D0B6,$31001920,$0E62BE58,$9451A5A7,$0C256FE6,$BCE08314
Data.l  $D7010465,$061A29EA,$C2107E26,$57732824,$80461681,$5840FD0C,$B76DA074,$23294065,$4048BE20,$E933BA0F
Data.l  $361BD383,$53B4C06E,$4DB79D40,$724BBB5C,$0E131303,$22B70720,$AB6D0176,$A40A5DEC,$FB89825B,$13667840
Data.l  $B547D1C6,$08838847,$FB01FA56,$6C03ABB3,$EC04AA83,$802BAEA4,$484C0F28,$091AB297,$C040EC71,$5410BD5A
Data.l  $359AE0E0,$79814BED,$F40400D0,$C8042BB1,$1D8EC30B,$2C35412C,$4E73E763,$DE031771,$4BE41433,$4C0FCB49
Data.l  $C17AD5D0,$BDD2C093,$4C059002,$6C10AAE2,$471BA236,$943616AB,$D8AC0770,$459DC12C,$065DBE3E,$7BBA01D0
Data.l  $215B2B91,$7291031E,$D3037960,$842780A4,$87980AE3,$5D005D7C,$C71C1872,$7C1F93B1,$9C63366B,$0707BC15
Data.l  $842C1CC7,$99C1A545,$DB1612AA,$98285EB7,$08825434,$795A0225,$8EA58580,$0252E801,$5DE0E0F6,$82006B45
Data.l  $37231AB8,$F3DAA28A,$8440CB02,$753B157E,$6AC019DF,$1BDB632E,$41187C54,$32BD4601,$133D7244,$EF2858A0
Data.l  $E61C8000,$01410B2A,$E008B804,$4B60A547,$8100BB02,$02AE3155,$998015E3,$E385A573,$C01895E9,$80928211
Data.l  $E2880B0D,$1D02E02C,$4007ECF8,$064E2568,$58004514,$BE398250,$45F6B00D,$C1338585,$9D26EB41,$8C6ADC1D
Data.l  $0058C3E7,$BECE9472,$BC180E4A,$E975900C,$47E000DA,$FB760139,$00ADF009,$36EDDB79,$0E0772B2,$207096CC
Data.l  $B8857AB8,$92D2811B,$12750352,$0F5A9D90,$200E6E04,$0365AB0A,$01D76D16,$80807A9E,$F859D0E9,$E101E975
Data.l  $62EF9A3C,$B1D015A8,$5848350E,$F7963403,$8CEE0E4A,$09AF5EEA,$0E6F0068,$67F99DA0,$11A10681,$268B7E01
Data.l  $A98E2EAD,$456C3F8A,$CCB60991,$2C05D431,$EC80D4B7,$7A7705D4,$CC9861DB,$A6201AE5,$E0550E1F,$445A4472
Data.l  $2A2F6DA0,$17572438,$0F76F442,$295923B8,$B000DDCB,$44F5587E,$404360F8,$2D7E3F38,$2023D61A,$B7CC0581
Data.l  $EA11DB01,$CAE5962C,$5DAB4B45,$77BD29CC,$5E1FE015,$6A01A021,$E6B38060,$180948BB,$E00F0127,$72353F9F
Data.l  $5FAE6DA3,$7AC11B19,$E8051006,$D8074960,$806357C8,$6A395640,$5EEEA554,$F3F601B9,$0AB08064,$DBE03C04
Data.l  $A55A4002,$061DDFDC,$508A18D8,$06DCB132,$5CE739D6,$C4B68480,$366B7F12,$8307F940,$0815EE02,$1C2607EC
Data.l  $70D8ADE0,$88C8E118,$E61A472F,$0163D293,$C7D035DA,$81018FC3,$3BA114BC,$F66012AF,$71829560,$5DA9716E
Data.l  $4E024156,$240C6559,$F21C8340,$805B2AB4,$8983DE5D,$363F7D13,$2B97DBAD,$F02AB68A,$0B12F16E,$45595422
Data.l  $65C65432,$FA582D80,$4326F006,$A8171E01,$8AB8D7C0,$A7135499,$C6115100,$CEF4F321,$F7562E7B,$5329F600
Data.l  $0D55DA70,$BA808712,$C2387C3B,$D5E07C06,$8AEE063B,$00311450,$623E32AF,$9003C7FA,$CC1403E3,$9AF0ED5B
Data.l  $09300432,$E26AD001,$AD75120A,$74B08C82,$A22D3053,$22465CE0,$9EC55F2A,$02D25010,$C301504E,$E30BE02E
Data.l  $036B8796,$015A94C8,$2830B032,$DB53BC1D,$BC3A362C,$74654470,$7549DD28,$7A208083,$DDEA709B,$1981142A
Data.l  $9D7E018F,$3A572E09,$032CA633,$AEC35095,$EFECB00D,$CC105010,$475BAC02,$AF8F74AA,$33BD636C,$32CD9354
Data.l  $B04ACE80,$8054F011,$16022D26,$15185166,$713F8EC5,$172CCAE8,$88D2C990,$DC619A6E,$81D4AF7C,$89B4C46B
Data.l  $C610DF00,$2FDD6E45,$A0319819,$C1024C04,$8FD9BFC8,$F63BAC88,$7089301C,$63AC4921,$8CF875B3,$379B0F3F
Data.l  $131406E6,$1F6CBD1E,$D100B240,$371769D6,$71CC5C1F,$0654C774,$60416F38,$185D7B80,$A1CE3858,$5782A09B
Data.l  $58520805,$F1875008,$3C4101D5,$A9E580E4,$4025D955,$A04459E9,$036B0892,$C063F660,$208EACC0,$12BDBA58
Data.l  $09D080B7,$EE71CB01,$F100A938,$D5803010,$0361BBA9,$4A2B5DC6,$4042F813,$6002CA3A,$42CB2FAC,$5608D2E9
Data.l  $5F240245,$2EEBC0E2,$BF298023,$695553A2,$093800F6,$40239718,$961F9C07,$19D050CD,$75A28C0E,$6981DB2E
Data.l  $00A8196A,$2E38E66E,$EAB62D9E,$08048288,$CA32F8F5,$052ACFF1,$5EBA58ED,$B2E401C0,$00EA8148,$00EAF8E3
Data.l  $0117AD1C,$D6D0ACBF,$AE0162D6,$B95F136F,$5C1A8637,$D00A610B,$4C114B0A,$A07DAF1E,$D86D08C9,$8F340195
Data.l  $D9051653,$DE1DF218,$E1012018,$3180F02A,$7EB557D0,$0926838D,$58D04021,$DFF00683,$208BA22B,$0A7712A9
Data.l  $2C76D230,$A31BB7A2,$44031211,$B4034BE6,$02AA8AE2,$703A00FC,$D2F78980,$B4B44F8B,$EAAC2816,$6F16095B
Data.l  $1EB08918,$74DA018E,$282153E2,$19008C3F,$406F3772,$01AE75BA,$04755172,$061FF10A,$1B5B6AD8,$816E94A0
Data.l  $62C83860,$0A00A182,$B401B136,$60067D44,$8242C5C7,$2BCC553A,$558B3E3B,$E857C1BE,$4FD4E025,$80A8E6B9
Data.l  $82485DEB,$AE33133F,$D1C004DC,$46C28BAC,$911142BB,$108072BB,$AACC528C,$E085D5CA,$8C618C04,$0595D0E1
Data.l  $207C6A78,$198D0DE0,$08C0931E,$10143E95,$1BE5F381,$01DE99F0,$11536496,$833EB118,$08C12E1A,$3BCAAE8F
Data.l  $00E80C0D,$86F8A46A,$759BE600,$8C8A131F,$2A2A900A,$034E2970,$05BCDA88,$E03C9C4C,$23045B1D,$4FDEAE18
Data.l  $B4315C40,$DCC503CE,$D005B403,$B4C3958B,$D218893D,$A5845CAF,$057704BD,$065FF784,$41C14400,$651C256E
Data.l  $4A805F15,$8BBC5154,$32B86B9B,$A8440795,$A77BE096,$817EC02A,$16E02A75,$16FDB47A,$902700CE,$60739F01
Data.l  $7E5ECF97,$66BFBF69,$AACE8C86,$38BE80A0,$3405B00D,$2ABE2EF1,$DB9EBCA1,$8E4B779B,$8CAF0D72,$3E6A8643
Data.l  $515F2920,$1C66D401,$8C1B60AC,$30680CC3,$ACBE8C77,$3C9EC302,$527C6E73,$097001BB,$7629E950,$D8E20E28
Data.l  $69F8B08F,$926A90B8,$ACB3DE01,$E53805B2,$B33C00A2,$CD400D4E,$87C8032E,$89000DAE,$38906DD0,$24106D77
Data.l  $46AD0B95,$0A2208B8,$E1937AEC,$5DD6CA7F,$1C050186,$54E4C198,$860E65DB,$5F3C01EE,$4F050075,$E2A2F183
Data.l  $CAF72998,$56B71C03,$E3E63A1A,$B00FE021,$9D006060,$FA3E3F75,$1F0CB669,$EB0B0230,$27E3B134,$16E635AB
Data.l  $4D5E6C53,$E2000172,$5899CFF7,$1806CF68,$C1595D09,$45F478B6,$067BD6E3,$46F8599A,$85E68055,$F2EBA021
Data.l  $0384EAD4,$A02C6BB3,$20979F15,$53DCEB56,$BFC14BE6,$AAF1D83C,$52A92804,$305D5E01,$CA2AC576,$AAB4D403
Data.l  $530F7012,$EB914B30,$C1A889C2,$012048AE,$34C0A88D,$8D6E093B,$2AC536A8,$781BB06A,$DB438CC1,$8804C756
Data.l  $00590F89,$602425B7,$DD8F541B,$6ED02628,$B7B490C1,$946F2A2D,$0C014C07,$4B95E608,$77BA3142,$AF19D014
Data.l  $5BAD84E0,$F1807BE0,$344D0091,$981C72C6,$BE36D45E,$89760846,$28DE004B,$A5628960,$46B8E501,$3228E005
Data.l  $2CB5C2A2,$217864C0,$04B60C04,$914EBA08,$D7E0C2BB,$3B809401,$AC208006,$A8054155,$97B69657,$04717A7D
Data.l  $500D1005,$180A5E87,$AE119D95,$7145BB15,$E6068285,$90051A62,$C1C5E547,$9A793BB5,$3003DEA1,$F9DE1B06
Data.l  $61C24FA4,$D0130422,$8FF164DE,$88613E5B,$12178301,$45FC72B4,$76175E43,$6BCBE7B9,$D28F2AE3,$D6FC9165
Data.l  $881300D1,$04BDBBC0,$A67C0A19,$A52CC24A,$78C3040E,$AA014C08,$1250E552,$81304E60,$8085F601,$7706567E
Data.l  $CEEFF8C2,$0F4850B0,$099180DF,$26020F6D,$620245E5,$40F61551,$4C1022FC,$D9B6AF33,$C6D03105,$EC7530AB
Data.l  $19740A6F,$D707F201,$6EA6C1CE,$9C17A35D,$0C78DCAF,$3E370B03,$085C1A05,$126ACF18,$07E2FD0A,$38F7E408
Data.l  $6B102807,$7876C055,$3955067A,$6145F746,$4D74A6D3,$24EFA638,$3DC2E640,$A14B51B6,$801201AB,$E9203A83
Data.l  $B24800C2,$501000A3,$77D3AF9C,$6DCC8FE9,$44717100,$2DC5B468,$0225A801,$8087595A,$C7215400,$60A8A983
Data.l  $B2AB6189,$06A2B304,$8C1A6723,$5C3DA922,$9285DDE0,$A0112AEC,$B17FC194,$129D752B,$BDA13050,$E7F89AEA
Data.l  $30128048,$3101AADA,$F56DEF2D,$CCD130C2,$1A248133,$A0108778,$042E0C2A,$2261E270,$3185A238,$0A06C8BA
Data.l  $CAE80338,$B015B4BA,$F010AB88,$00C62E8E,$81C6B9E0,$D433FAE2,$6C006C08,$9665402A,$EF80D80C,$400110C8
Data.l  $77AAD2B9,$DB4750B0,$5A0174A2,$DB1312E3,$4BA023FD,$33D20723,$77A04219,$98EB06CB,$04010EB0,$24A68328
Data.l  $2D00A1B2,$067A5570,$7BF05BBC,$85540049,$193A5D1E,$804AFF60,$00E2B8B4,$EE64B292,$1704E318,$4014B016
Data.l  $DEFF77AE,$8CBF0F55,$041B1C61,$BE839DB8,$3D2A0024,$10128804,$DC23DE10,$74F403C2,$A3C1F259,$68CD8053
Data.l  $14BD2E93,$9A012B16,$B9F4E752,$B43C82AB,$16BA8046,$2C420482,$12AD1BDD,$4F402A95,$24EEA101,$855A2134
Data.l  $55C31C31,$FA407E01,$12B8F006,$D7B97770,$084581C9,$80D52E36,$EDF35AF1,$D8CC6CB9,$5B716805,$80853288
Data.l  $C2B97C28,$C80BA6D8,$F45D5300,$83452EA5,$01655662,$1397D91E,$06B67A30,$CF616908,$E75AD115,$DEFC7601
Data.l  $CB62BDBB,$D3C60900,$55F14029,$F2AB33C6,$60C6D90B,$B0BDD621,$CCF0014E,$986F0191,$E62A556D,$00000C16
WordList_End: ; endlabel
EndDataSection


Re: Trie

Posted: Sun Sep 26, 2010 12:38 am
by idle
example using a mozilla dictionary

Code: Select all

;Test code_____________________________________________________________________
Global result.s 
Procedure MyTreeCallBack(*item)
   
  result + PeekS(*item) + " "  
 
EndProcedure   

Global mt.clsTrie = NewTrie(@mt)

fn = ReadFile(-1,"en_GB.dic")
If fn 
 While Not Eof(fn)  
    tp.s = ReadString(fn,#PB_Ascii)
    pos = FindString(tp,"/",1)-1
    If pos > 0 
    tp = Left(tp,pos)
    EndIf 
   mt\add(tp,Len(tp))
   ct+1
 Wend 
 CloseFile(fn) 
EndIf 

Debug ct

Global benum 
InitMouse()

If OpenConsole()
  PrintN("Enter a word hit enter to check against dictionary")
  PrintN("hold left mouse button and hit enter to get a list of words")
  PrintN("type quit To End")
  Repeat
    ClearConsole()
    str$ = Input()
    
    If GetAsyncKeyState_(#VK_LBUTTON) & 1
      benum = 1 
      Debug "mouse"
    EndIf   
    
    If benum 
      mt\Enum(str$,@MyTreeCallBack())
      PrintN(result)
      result = ""
      benum = 0 
    ElseIf str$ <> ""
      If mt\LookUp(str$)
       PrintN("Words in dictionary " + str$)
      ElseIf str$ <> "quit"
        PrintN("I don't know that word add it to dictionary [y/n]?")
        If Input() = "y"
          mt\Add(str$,Len(Str$))
        EndIf
      EndIf
    EndIf     
    Delay(20)
  Until str$ = "quit"

EndIf

mt\Free()