Skip to content

Instantly share code, notes, and snippets.

@LeslieK
Created March 23, 2014 03:58
Show Gist options
  • Save LeslieK/9718502 to your computer and use it in GitHub Desktop.
Save LeslieK/9718502 to your computer and use it in GitHub Desktop.
Binary Search Trees vs Red-Black Tree Experiments
{
"metadata": {
"name": "BinaryTrees"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "%matplotlib inline",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": "import matplotlib.pyplot as plt\nimport numpy as np\nimport math",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 135
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Binary Search Tree: keys = range(10000) in random order"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from bst import BST\ntrials = 10000\nmaxval = 20\nb = BST(trials, maxval)\n\nkeys = range(trials)\nimport random\nrandom.shuffle(keys)\nfor k in keys:\n b.put(k, k)\nb.a.plotData()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x8982710>"
}
],
"prompt_number": 179
},
{
"cell_type": "code",
"collapsed": false,
"input": "m = b.a.means[10000 - 1]\nprint m, 1.39 * math.log(10000, 2)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "16.2066 18.4699202076\n"
}
],
"prompt_number": 181
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Red-Black Search Tree: keys = range(10000) in random order"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from redblacktrees2 import RedBlackBST\ntrials = 10000\nmaxval = 20\nr = RedBlackBST(trials, maxval)\n\nkeys = range(trials)\nrandom.shuffle(keys)\n\nfor k in keys:\n r.put(k, k)\n \nprint r.size()\nr.a.plotData()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "10000\n"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x8a92668>"
}
],
"prompt_number": 184
},
{
"cell_type": "code",
"collapsed": false,
"input": "m = r.a.means[trials - 1]\nprint m, math.log(trials - 1, 2) - .5\nr.a.vals[trials - 1]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "13.2595 12.7875681028\n"
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 185,
"text": "16.0"
}
],
"prompt_number": 185
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Binary Search Tree: Tale of Two Cities"
},
{
"cell_type": "code",
"collapsed": false,
"input": "with open(\"TaleOfTwoCities.txt\") as f:\n words = (word for line in f for word in line.split() if len(word) > 7)\n total = (1 for word in words)\n print sum(total)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "13525\n"
}
],
"prompt_number": 137
},
{
"cell_type": "code",
"collapsed": false,
"input": "from bst import BST\ntrials = 13525\nmaxval = 20\nb = BST(trials, maxval)\nwith open(\"TaleOfTwoCities.txt\") as f:\n words = (word for line in f for word in line.split() if len(word) > 7)\n \n for w in words:\n if w in b:\n b.put(w, b.get(w) + 1)\n else:\n b.put(w, 1)\nprint b.size()\nb.a.plotData()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "4371\n"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nHEoiAEYMAEy6XeNfVbVVtQAAAABJRU5ErkJggg==\n",
"text": "<matplotlib.figure.Figure at 0xacc3710>"
}
],
"prompt_number": 186
},
{
"cell_type": "code",
"collapsed": false,
"input": "m = b.a.means[13524]\nprint m, 1.39 * math.log(13524, 2)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "17.467948244 19.0752956782\n"
}
],
"prompt_number": 141
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Red-Black Trees: A Tale of Two Cities"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from redblacktrees2 import RedBlackBST\ntrials = 13525\nmaxval = 20\nr = RedBlackBST(trials, maxval)\nwith open(\"TaleOfTwoCities.txt\") as f:\n words = (word for line in f for word in line.split() if len(word) > 7)\n \n for w in words:\n if w in r:\n r.put(w, r.get(w) + 1)\n else:\n r.put(w, 1)\nprint r.size()\nr.a.plotData()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "4371\n"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x15449e10>"
}
],
"prompt_number": 191
},
{
"cell_type": "code",
"collapsed": false,
"input": "m = r.a.means[trials - 1]\nprint m, math.log(trials - 1, 2) - .5\nr.a.vals[trials - 1]",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "11.1570425139 13.2232343009\n"
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 192,
"text": "12.0"
}
],
"prompt_number": 192
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Red-Black Trees: Number of Node Splits"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from redblacktrees2 import RedBlackBST\ntrials = 10000\nmaxval = 10\nr = RedBlackBST(trials, maxval)\n\nkeys = range(trials)\nrandom.shuffle(keys)\n\nfor k in keys:\n r.put(k, k)\n \nprint r.size()\nr.a.plotData()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "10000\n"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0xacc89b0>"
}
],
"prompt_number": 177
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Red-Black Trees: Number of Left and Right Rotations"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from redblacktrees2 import RedBlackBST\ntrials = 10000\nmaxval = 10\nr = RedBlackBST(trials, maxval)\n\nkeys = range(trials)\nrandom.shuffle(keys)\n\nfor k in keys:\n r.put(k, k)\n \nprint r.size()\nr.a.plotData()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "10000\n"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nubm5rR1Cm8Oc1Mac1I15aRnNetnwtWrsB5iIiOj6NMdxttWu8roWJpOp3h+GoqZLSEiAy+Vq7TCI\nqINpV69Q+MpFHcwjETXHcYBfDklERKpgQSEiIlWwoBARkSpYUIiISBUsKK2ooKCgwd8EJyJqT1hQ\niIhIFSwoRESkChYUFaxbt075vWzZQw89hIceegivvfYarFYrjEYjMjIy8NJLL9XbTkREBE6ePKnc\nv+eee/D//t//U+6/9957GDRoEBISEnDrrbcqP1wmx5CSkgKj0Yg+ffogPz9fxS0kImpchykoDocD\nDoejVdqYP38+du3ahfLycgBAMBjE9u3b8b3vfQ9JSUnYuXMn3G43Nm3ahEceeQSHDx9uUruhvxlz\n+PBhLF26FC+//DJcLhd+8IMfYPr06aiqqsLRo0fx4osv4uDBg3C73dizZw8sFstVbwcR0fXoMAWl\nNaWlpWHw4MH429/+BgDIz8+HwWDALbfcgilTpuCmm24CAIwePRq33347Pvroo6vu46WXXsIPfvAD\nDBs2DBqNBosXL0Z0dDQ+/fRT6HQ6+Hw+HDlyBFVVVUhLS8PNN9+s6jYSETWmwxSU9PR0pKent1ob\nCxYsUL5h+c0338T3vvc9AEBeXh6GDx+OxMREJCQkYNeuXbh48eJVt+9wOLB+/XokJCQof2fOnMG5\nc+eQkZGB559/HitXrkS3bt0wf/58nDt37pq2g4joWnWYgtLaZs+ejYKCApw9exZvv/02FixYAJ/P\nh1mzZuGxxx7D119/jUuXLmHKlCn1fn+OwWCAx+NR7ocWhbS0NPziF7/ApUuXlL/y8nLMmzcPgPS2\n20cffQSHwwGNRoOf//znzbvBREQ1sKCopGvXrsjNzcU999yDm2++Gb1794bf74ff70eXLl0QERGB\nvLw87Nmzp942Bg0ahC1btiAYDGL37t3Yv3+/Mu++++7D73//e3z22WcQQqCiogI7d+5EeXk5jh07\nhvz8fPh8PkRHR0Ov10Or1bbEZhMRKVhQVLRgwQJ88MEHWLBgAQAgLi4OL7zwAubOnQuTyYS33noL\nM2bMCFtHPukOABs2bMC7776LhIQEvPnmm7jjjjuUeUOGDMHLL7+MBx98ECaTCb169cIf//hHAIDP\n58Py5cvRtWtXdO/eHRcuXMCaNWtaYIuJiK5o819fL191lZ6ezq9dV8nV5tHhcMDpdMJsNivTruVc\n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\n",
"text": "<matplotlib.figure.Figure at 0x8a937b8>"
}
],
"prompt_number": 178
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": "Red-Black Trees: Costs (Compares) using words from 1M random sentences from the Internet"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from redblacktrees2 import RedBlackBST\ntrials = 4239597\nmaxval = 25\nr = RedBlackBST(trials, maxval)\nwith open(\"leipzig1M.txt\") as f:\n words = (word for line in f for word in line.split() if len(word) > 7)\n \n for w in words:\n if w in r:\n r.put(w, r.get(w) + 1)\n else:\n r.put(w, 1)\nprint r.size()\nr.a.plotData()",
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment