Listen to Please Bartender 2.0 on Spotify. Dallas Baker Song 2017. Osamu Kashiwagi (柏木 修, Kashiwagi Osamu) is a recurring character in the Yakuza series. He appears as a supporting character and ally in each of Yakuza 0, Yakuza/Yakuza Kiwami, Yakuza 2/Yakuza Kiwami 2, Yakuza 3 and Yakuza: Like a Dragon. He is the Captain of Shintaro Kazama's Kazama Family, a subsidiary of the Tojo Clan's Dojima Family that later became a direct subsidiary of the Tojo.
Problem:
At a popular bar, each customer has a set of favorite drinks, and will happily accept any drink among this set. For example, in the following situation, customer 0
will be satisfied with drinks 0, 1, 3,
or 6
.
A lazy bartender working at this bar is trying to reduce his effort by limiting the drink recipes he must memorize. Given a dictionary input such as the one above, return the fewest number of drinks he must learn in order to satisfy all customers.
For the input above, the answer would be 2
, as drinks 1
and 5
will satisfy everyone.
Solution:
We often encounter interview questions where no efficient polynomial time algorithm exists. While it's important to be able to code an exponential/super-polynomial time solution, it is equally important to argue why no polynomial time solution exists.
The exciting theory of NP-completeness is extremely useful to prove exactly that! You are not expected to make rigorous use of the theory during the interview. But we are still going to devote this section to develop a proof — it's fun and you might get in good grace of the interviewer if you argue on these lines 🙂
We are going to use Polynomial-Time Reduction along with NP-completeness to prove that no efficient polynomial algorithm exists for the Lazy Bartender Problem. Here is how it works
- Start with an instance of known NP-complete problem. There are quite a few. Picking up the right problem for reduction is more of an art than science!
- Develop a polynomial time algorithm to convert that instance to an instance of the Lazy Bartender Problem. Again, there is no standard recipe for this, you need to use your insight/imagination to do this.
- Argue that,
- Every instance of the known NP-complete problem can be converted to a different instance of the Lazy Bartender problem.
- If we could solve the Lazy Bartender problem, we could also solve the NP-complete problem by first converting it to Lazy Bartender. But that's impossible! (unless P=NP). By definition, no efficient algorithm exists for any NP-complete problem. Hence, by contradiction, we have proved that even the Lazy Bartender belongs to the NP-complete class, and can not be solved efficiently.
We are going to use the Vertex Cover problem as the known NP-complete problem for the reduction. Here is how the problem is defined
You are given a graph G(V, E)
with vertex-set V
, and edge set E
. Find the smallest subset S
of the vertices so that every edge in E
has at least one end-point in S
.
Here is an instance of the Vertex Cover problem:
The graph has 6 vertices V = {1, 2, 3, 4, 5, 6}
, and 5 edges E = {a, b, c, d, e}
. The goal is to find the smallest subset S
of V
which ‘covers' all the edges in E
. Of course, the solution in this case is S = {1, 3}
. Because every edge in E
is either connected to the vertex 1
or 3
.
The Vertex Cover problem is NP-complete — no efficient polynomial time algorithm exists to solve it. Here is how we can ‘reduce' this problem to a seemingly unrelated Lazy Bartender:
- Take any arbitrary instance of the Vertex Cover problem, represented by the graph
G(V, E)
. - Create a new drink for every vertex
v
inV
. - Create a customer for every edge
e
inE
. - Let
e
be an edge in the graph connection verticesx
andy
. Then the customer corresponding toe
prefers drinks corresponding tox
andy
, nothing else! Thus, every customer prefers exactly two drinks!
The instance of Vertex Cover in the diagram above can be reduced to the following preferences
map in the Lazy Bartender
The reduction can be achieved using a polynomial time algorithm (by simply iterating over the vertices once). If we could efficiently solve the Lazy Bartender problem, we could also efficiently solve the NP-complete Vertex cover problem! (Which is impossible, unless, again, P=NP). Hence, no polynomial time algorithm exists for the Lazy Bartender.
Algorithm:
Now that we know that no efficient algorithm exists, we have to resort to trying all possible subsets of drinks. Since there are 2C subsets of C drinks, the complexity of the algorithm is at least O(2C)
. Here is one recursive implementation for trying all subsets of C
.
Complexity:
What's the complexity of the above algorithm? The complexity of a recursive function like best_drinks_recursive
can itself be calculated recursively. Let C
be the number of drinks, and N
be the number of customers. Let T(n)
denote the time complexity of best_drink_recursive
function on n
drinks. How does T(n)
depend on T(n-1)
? During each call to best_drinks_recursive
on n
drinks, we call best_drink_recursive
on n-1
drink twice! Once with first drink included, and other without the first drink. Moreover, in every call, we potentially iterate over all the customers, N
, updating/copying a few arrays/maps etc. As a result,
Assuming N << 2C
, and solving the above equation gives us T(C) = O(2C)
.
Testing:
Here are a few interesting test cases:
- Empty preferences dictionary
- Single drink
- ‘popular' drink: A single drink preferred by all customers
- A random dictionary like the one in the problem statement
Released:
Beergarden Backend
Project description
Bartender is the beer-garden backend. It's responsible for maintaining plugin health/status and running the actual plugins.
Getting Started
Pre-requisites
- Python >= 2.7, 3.4
- pip
- Connectivity to MongoDB Server - (Tested on 3.4)
- Connectivity to Rabbitmq-Server - (Tested on 3.6)
Get Up and Running
When installed from pip you can simply:
These are the minimum required steps once you have all the pre-requisites up and running.
There are several plugins that are loaded by default. You can view them in the brew-view UI.
Testing
Running the tests:
Generating coverage:
Linting:
Credits
- Doug Hellmann (@doughellmann) - Doug originally owned the bartender name but was willing to allow us to have it so that we didn't have to change a lot of documentation. Thanks very much Doug!
Release historyRelease notifications | RSS feed
2.4.10
2.4.10
2.4.9
2.4.8
2.4.7
2.4.6
2.4.5
2.4.4
2.4.3
2.4.2
Bartender 2021 R4
2.4.1
2.4.0
2.3.7
2.3.6
2.3.5
2.3.4
2.3.3
2.3.2
2.3.1
1.0
2.0 Facebook
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size bartender-2.4.10-py2.py3-none-any.whl (41.2 kB) | File type Wheel | Python version py2.py3 | Upload date | Hashes |
Filename, size bartender-2.4.10.tar.gz (33.1 kB) | File type Source | Python version None | Upload date | Hashes |
Hashes for bartender-2.4.10-py2.py3-none-any.whl
Algorithm | Hash digest |
---|---|
SHA256 | 3f9b1d2f4737d7330f144a87549b182cb0143c4c1a12fd3cc806579b68133b09 |
MD5 | 30e94e7bbb4fc2b60c974d686f3e306c |
BLAKE2-256 | b099aaf3512c789fa724bb520a7bfae7d5f4810f693c420e127c2613aa046162 |
Hashes for bartender-2.4.10.tar.gz
Bartender 2 0 5 Download
Algorithm | Hash digest |
---|---|
SHA256 | eea7670f6383c670f2bcbaebfc73c44779999743c6078078d9aca0f25bc42b0a |
MD5 | 0e25fdfbd573e6cb3ccfbc7fa09a572d |
BLAKE2-256 | e02b73116d48a20858fbee4694096c1323188ec2b80b878cdb4ea14168d2568f |