Cleaned up string compress notebook. Refactored duplicate algorithm description.

This commit is contained in:
Donne Martin 2015-05-08 16:48:22 -04:00
parent ef6c382a90
commit e8060f4b6e

View File

@ -4,7 +4,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## Problem: Compress a String Such that 'AAABCCDDDD' Becomes 'A3B1C2D4'. Only Compress if it Saves Space.\n", "## Problem: Compress a string such that 'AAABCCDDDD' becomes 'A3B1C2D4'\n",
"\n", "\n",
"* [Clarifying Questions](#Clarifying-Questions)\n", "* [Clarifying Questions](#Clarifying-Questions)\n",
"* [Test Cases](#Test-Cases)\n", "* [Test Cases](#Test-Cases)\n",
@ -25,7 +25,9 @@
"* Can you use additional data structures? \n", "* Can you use additional data structures? \n",
" * Yes\n", " * Yes\n",
"* Is this case sensitive?\n", "* Is this case sensitive?\n",
" * Yes" " * Yes\n",
"* Do you compress even if it doesn't save space?\n",
" * No"
] ]
}, },
{ {
@ -48,7 +50,7 @@
"\n", "\n",
"![alt text](https://raw.githubusercontent.com/donnemartin/algorithms-data-structures/master/images/compress_string.jpg)\n", "![alt text](https://raw.githubusercontent.com/donnemartin/algorithms-data-structures/master/images/compress_string.jpg)\n",
"\n", "\n",
"Since Python strings are immutable, we'll use a list to exercise array manipulation. Note using a list vs a bytearray will will result in additional space to create the list and to convert the list to a string.\n", "Since Python strings are immutable, we'll use a list of characters to exercise string manipulation. Note using a list vs a bytearray will will result in additional space to create the list and to convert the list to a string.\n",
"\n", "\n",
"* If string is empty return string\n", "* If string is empty return string\n",
"* count = 0\n", "* count = 0\n",
@ -78,7 +80,7 @@
"\n", "\n",
"Complexity:\n", "Complexity:\n",
"* Time: O(n)\n", "* Time: O(n)\n",
"* Space: O(m) where m is the size of the compressed bytearray" "* Space: O(2m) where m is the size of the compressed list and the resulting string copied from the list"
] ]
}, },
{ {
@ -145,35 +147,9 @@
"\n", "\n",
"![alt text](https://raw.githubusercontent.com/donnemartin/algorithms-data-structures/master/images/compress_string.jpg)\n", "![alt text](https://raw.githubusercontent.com/donnemartin/algorithms-data-structures/master/images/compress_string.jpg)\n",
"\n", "\n",
"Since Python strings are immutable, we'll use a bytearray to exercise array manipulation. We could use a list of characters to create the compressed string then convert it to a string in the end, but this will result in additional space.\n", "Since Python strings are immutable, we'll use a bytearray to exercise array manipulation. As seen above, we could use a list of characters to create the compressed string then convert it to a string in the end, but this will result in additional space.\n",
"\n", "\n",
"* If bytearray is empty return bytearray\n", "The algorithm is the same, except we will need to work with the bytearray's character codes instead of the characters as we did above when we implemented this solution with a list.\n",
"* count = 0\n",
"* size = 0\n",
"* last_char_code = first char code in bytearray\n",
"* For each char code in bytearray\n",
" * If char code == last_char_code\n",
" count++\n",
" * Else\n",
" size += 2\n",
" count++\n",
" last_char_code = char code\n",
"* size += 2\n",
"* If the compressed bytearray size is >= bytearray size, return string\n",
"* Create compressed_bytearray\n",
"* pos = 0\n",
"* For each char code in bytearray\n",
" * If char code == last_char_code\n",
" count++\n",
" * Else\n",
" * compressed_bytearray[pos] = last_char_code\n",
" * compressed_bytearray[pos + 1] = count\n",
" * pos += 2\n",
" * count = 1\n",
" * last_char_code = char code\n",
" * compressed_bytearray[pos] = last_char_code\n",
" * compressed_bytearray[pos + 1] = count\n",
"* return compressed_bytearray\n",
"\n", "\n",
"Complexity:\n", "Complexity:\n",
"* Time: O(n)\n", "* Time: O(n)\n",