Implementing the Dictionary Trie: Defining the Data Structures

Purpose

In this post, we are going to start implementing the dictionary trie.  To start this we will design the data structure. Below is a UML-ish representation of  a TrieNode

Because I want to learn some new (to me) functional languages (HaskellClojure, and Scala), and this blog is more for my benefit than anything else, we will use Haskell in this post.  

I won't go over the benefit of functional languages here.  There are many other posts/articles that do a better job explaining/selling functional languages over other paradigms.

Quick Review of Trie Node


We came up with this UML'is representation of a single node of our data structure back in the very first post.
  1. The "wordFragment" stores the substring of the word at that point in the trie.  For leaf nodes, these word fragments are guaranteed to be suffixes to a word in the dictionary.
  2. The "children" is a set of pointers to other TrieNodes. It is this aspect that allows this single node to become a tree. Do not read too much into the array notation.
  3. The "isWord" indicator is needed to indicate if a non-leaf tree is a word end (although we will use it in leaf nodes as well).  All leaf nodes are guaranteed to be word ends.  
  4. The "isTop" indicator is used only for the special degenerate top-level of the trie.  Please review the second post Dictionary Trie Insertion for the explanation of why this trie is needed.
Haskell Implementation First Draft

data TrieNode  = TrieNode { wordFragment :: String, children :: [TrieNode] 
                            isTop :: Bool, isWord :: Bool} 

This is absolutely sufficient for implementing everything required.  We have here a Haskell record syntax which provides us some syntactic sugar and some autogenerated functions (loosely akin to "getters" for people coming from an OO background).

In order to initialize a top node, we would:

topNode  = TrieNode { wordFragment ="" , children = [] , isTop = True, isWord = False} 

But let's consider some details.

Walking Down the Tree
Remember this tree (from the second post)?

We can see the arrows leading down from the prefixes to the end nodes. Walking down on the left hand side, we get: "re" + "al" + "ize" + "s" =  "realizes". But there is something missing (in both this diagram and in our Haskell record syntax) in describing how we represent which arrow points to which node.

We need something more like this:

which shows that we can access our sub-nodes by assigning the first character in the child node's "wordFragment" to the edge.

So let's change our code a bit, and instead of using a a list to represent the children in our node, we will use a Map (with a capital M, to remove ambiguity with the function 'map').

import qualified Data.Map as Map

data TrieNode  = TrieNode { wordFragment :: String, children :: Map.Map Char TrieNode
                            isTop :: Bool, isWord :: Bool} 

There is nothing wrong with a list.  It would be just inelegant to find the appropriate sub-child by searching through the list, when a hash lookup based on the first character would get us better performance.

4 comments:

  1. พบกันอีกครั้งวันนี้ MEGA GAME เว็บตรงอันดับ 1 MEGA GAME โปรโมชั่นสล็อต จัดเต็มกับโปรร้อนๆ ที่มีรูปแบบที่หลากหลาย มั่นใจได้เลยว่า โปรโมชั่นสล็อต ฝาก 19 บาท ได้ 100 สามารถสร้างความพึงพอใจ ให้เหล่าสมาชิก นักเสี่ยงโชคทุกคน ได้อย่างแน่นอน ไม่ว่าจะเป็นนักเสี่ยงโชค ผู้เล่นมือใหม่ หรือนักเสี่ยงโชคผู้เล่น สมาชิกเก่าก็ตาม รวมโปรโมชั่นสล็อต หากมีบัญชีกับ MEGA GAME เว็บใหม่ล่าสุดแห่งนี้อยู่แล้ว นักเสี่ยงโชคสามารถ ที่จะเข้าร่วมเว็บสล็อตโปรโมชั่นดีๆกับค่ายเกมมากมายหลายค่ายBETFLIX และเล่น ได้ทันที ทั้งในส่วนของ สล็อต โปรโมชั่นสมาชิกใหม่ PG สำหรับนักเสี่ยงโชค ผู้เล่นมือใหม่ ที่พึ่งทำการสมัครสมาชิก เว็บสล็อตโปรโมชั่นดีๆ เพียงกรอกรายละเอียด ข้อมูลส่วนตัว กับทางเว็บสำเร็จ สามารถรับเงิน ฟรีตรงนี้ไปเลย โปรโมชั่นสล็อตทุนน้อย รวมถึงอีกหนึ่ง โปรโมชั่นยอดนิยม ที่นักเสี่ยงโชค ผู้เล่นทุกคนสามารถ เข้าถึงกันได้อย่างง่ายนั่นคือ โปรโมชั่นสล็อต50รับ100 รับฟรีเงินเดิมพันและต่อยอดสร้างกำไร รวมโปรโมชั่นสล็อตให้กับตนเองได้ อย่างแน่นอน

    ReplyDelete
  2. เกมสล็อต คาสิโน Betflik, Betflix หรือ เบทฟิก นั้น สามารถเข้าเล่นได้บนทุกอุปกรณ์ ผ่านทางเข้าตามลิ้งค์ด้านล่างนี้ ไม่ว่าจะเป็นโทรศัพท์มือถือ แทปเล็ท โน้ตบุ๊ค หรือคอมพิวเตอร์ตั้งโต๊ะ เพียงท่านล๊อคอินเข้าเล่นเกมส์ผ่านเว็บบราวเซอร์ betflik68 ที่ท่านมี

    ReplyDelete
  3. あなたの文章はいつも私に考えさせてくれます。新しいことを学ぶように私に挑戦してくれることに感謝しています。 タップ スピードというゲームを紹介したいと思います。これは楽しく簡単に手の目を改善する方法です。 調整とクリック速度。 試してみる!

    ReplyDelete
  4. Su optimismo es contagioso y me ha hecho sentir animado y listo para enfrentar el mundo con un sentido renovado de positividad. Acabo de aprobar la CPS test : ¡es imprescindible para aquellos que desean refinar su destreza cognitiva!

    ReplyDelete