---
# System prepended metadata

title: 'Day 29: Hash Tables, Dynamic Programming'

---

# Day 29: Hash Tables, Dynamic Programming

**You should be able to:**
- Explain what a hash table is
- Explain what makes hash tables so powerful
- Define what dynamic programming is
- Define the methods around dynamic programming (memoization/top-down and bottom-up)


## What is open addressing?

- Open addressing is one way to deal with hash table collisions. If a bucket is full, find the next empty bucket and place the value in that spot instead of the first place it was hashed to.

Strategies to Open Addressing:

- Linear Probing
    - Take whatever the value we get from the hash function and just move to the next slot (hash + 1), (hash + 2), ...
- Quadratic Probing
    - Instead of moving up +1 to the next slot, you move up by an arbitrary quadratic polynomial (hash + 1^2), (hash + 2^2), ...
- Double Hashing
    - Use a secondary hash of the key as an offset when a collision occurs


## What is separate chaining?

- Separate chaining is one way to deal with hash table collisions. Every bucket stores a secondary data structure, like a linked list. When collisions happen, it will create a new entry in that data structure.


## What is the time complexity of insert in a hash table (i.e. adding a new key-value pair)?

- O(n) - linear
- O(log(n)) - logarithmic
- **O(1) - constant** ☑️
  - The idea here is that it will take they key, hash it to come up with a memory address and store the value there.
- O(n * log(n)) - loglinear


## What is the time complexity of retrieval in a hash table (i.e. fetching the value given a key)?

- O(n) - linear
- O(log(n)) - logarithmic
- **O(1) - constant** ☑️
  - The point of a hash table is that we avoid the pitfalls of a linear data structure like an array where we have to linearly search the array to retrieve a value if we don't know the index of which that value exists.
- O(n * log(n)) - loglinear


## What is the time complexity of searching for a KEY in a hash table (i.e. find if a certain key exists in the hash table)?

- O(n) - linear
- O(log(n)) - logarithmic
- **O(1) - constant** ☑️
  - Hash table is hashed so while searching for a key might not be the first thought of to search for in a hash table, we can just directly check if a key exists. If we are searching for the key `potato`, then we search for it as `hashTable.potato`
- O(n * log(n)) - loglinear


## What is the time complexity of searching for a VALUE in a hash table (i.e. find if a certain value exists in the hash table)?

- O(n) - linear
- O(log(n)) - logarithmic
- **O(1) - constant** ☑️
  - Given the key, it gets sent through the hash function to retrieve a value. Remember, a hash table is a set of key-value pairs so values will be accesed by a key. If the value doesn't exist, it will return nothing.
- O(n * log(n)) - loglinear
