{ "cells": [ { "cell_type": "markdown", "id": "49477604", "metadata": {}, "source": [ "# Trie Data Structure" ] }, { "cell_type": "markdown", "id": "d6fbd5f6", "metadata": {}, "source": [ "Define a class `Trie` that can be used for fast lookups of strings.\n", "Such classes are frequently used in many natural language processing applications.\n", "\n", "(Writing such a class is also a common interview question; you need\n", "to be able to do it in real time.)\n", "\n", "Have your class update a global variable `nops` for each node traversal during\n", "`add`, `lookup`, and `remove` operations." ] }, { "cell_type": "code", "execution_count": 11, "id": "7da39832", "metadata": { "collapsed": false }, "outputs": [], "source": [ "class Trie:\n", " def __init__(self):\n", " pass\n", " def add(self,s,value):\n", " \"\"\"Add the string `s` to the `Trie` and\n", " map it to the given value.\"\"\"\n", " global nops\n", " nops += 1 # this is just a placeholder\n", " pass\n", " def lookup(self,s,default=None):\n", " \"\"\"Look up the value corresponding to the\n", " string `s`.\"\"\"\n", " def remove(self,s):\n", " \"\"\"Remove the string s from the Trie.\n", " Returns True if the string was a member.\"\"\"\n", " pass\n", " def prefix(self,s):\n", " \"\"\"Check whether the string `s` is a prefix\n", " of some member.\"\"\"\n", " pass\n", " def items(self):\n", " \"\"\"Return an iterator over the items of the `Trie`.\"\"\"" ] }, { "cell_type": "markdown", "id": "e241371b", "metadata": {}, "source": [ "# Unit Tests" ] }, { "cell_type": "markdown", "id": "c10be409", "metadata": {}, "source": [ "Write some unit tests demonstrating that your class works as intended.\n", "The next cell gives some examples, but you need to write additional tests\n", "for other methods and common sequences of operations." ] }, { "cell_type": "code", "execution_count": 21, "id": "9965f973", "metadata": { "collapsed": false }, "outputs": [ { "ename": "AssertionError", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mtrie\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlookup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"street\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mtrie\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlookup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"house\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32massert\u001b[0m \u001b[0mtrie\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlookup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"hello\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mtrie\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlookup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"world\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAssertionError\u001b[0m: " ] } ], "source": [ "trie = Trie()\n", "trie.add(\"hello\",1)\n", "trie.add(\"world\",2)\n", "assert not trie.lookup(\"street\")\n", "assert not trie.lookup(\"house\")\n", "assert trie.lookup(\"hello\")\n", "assert trie.lookup(\"world\")" ] }, { "cell_type": "code", "execution_count": 23, "id": "4b23d401", "metadata": { "collapsed": false }, "outputs": [], "source": [ "trie = Trie()\n", "nops = 0\n", "trie.add(\"hello\",1)\n", "assert nops>0" ] }, { "cell_type": "markdown", "id": "71de5b4e", "metadata": {}, "source": [ "# Performance Measurements" ] }, { "cell_type": "markdown", "id": "9fbef093", "metadata": {}, "source": [ "Next, let's measure how `Trie` performance scales on real data." ] }, { "cell_type": "code", "execution_count": 24, "id": "7d114a5d", "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "74354 ['the', 'adventures', 'of', 'tom', 'sawyer', 'mark', 'twain', 'harper', 'and', 'brothers']\n" ] } ], "source": [ "import re\n", "words = re.findall(r'\\w+',open(\"tomsawyer.txt\").read())\n", "words = [w.lower() for w in words]\n", "print len(words),words[:10]" ] }, { "cell_type": "code", "execution_count": 17, "id": "5be56794", "metadata": { "collapsed": false }, "outputs": [], "source": [ "counts = []\n", "for n in range(1000,70000,1000):\n", " trie = Trie()\n", " nops = 0\n", " for i,w in enumerate(words[:n]):\n", " trie.add(w,i)\n", " counts.append((n,nops))" ] }, { "cell_type": "code", "execution_count": 18, "id": "dd835354", "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "counts = array(counts)\n", "plot(counts[:,0],counts[:,1])" ] }, { "cell_type": "code", "execution_count": null, "id": "2f2b2953", "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": {}, "nbformat": 4, "nbformat_minor": 5 }