Weird Puzzle Questions - Egg and Celebrity

Published: Jun 13, 2017

I’m going to write about two weird algorithm problems. Those seem quite weired at least to me, yet famous as algorithm questions. One is so-called egg dropping, another is finding a celebrity. I see these two problems here and there. From that, I guess those two are famous algorithm questions. But, at least, those two are quite weird. Some call them puzzle. (Yeah, maybe… I was totally puzzled.)

The egg dropping and finding a celebrity problems are unrelated. The approaches and solutions are very different. However, in terms of their weirdness, I’m going to write a memo put those two together here.

Problem Description - Egg Dropping

Many algorithm questions have succinct descriptions. Not like those, this problem needs lengthy explanation. I re-read a few times to understand such long description correctly. Also, it was to figure out how to solve the problem.

The problem is sometime called “Two Egg Problem” since often two eggs are used. These two eggs play a role to find the highest, safe floor to drop the egg without breaking it. The problem description is:

  • K floors are there in total.
  • There exists the highest floor an egg safely lands.
  • Two (or more) eggs are given.
  • If the egg doesn’t break after the dropping, it can be reused.
  • If the egg breaks, the broken egg won’t be used again.
  • If the egg safely lands after dropping from the floor K_j, lower floors of K_j are considered safe.

Given above conditions, “find the highest, safe floor to drop the egg” is the problem.

The idea to find the highest safe floor

A bruto force solution is always there which starts dropping the egg from the lowest floor. Then, try one by one going upward to the top floor. At some floor, the egg will break for the first time. One floor below (the last safe floor) is the answer. If only one egg is available, this is only way to solve the problem.

However, there’s an effective solution when multiple eggs are available.

This problem is often categorized to dynamic programming. So, an optimal substructure exists:

  • the egg breaks
  • the egg doesn’t break (safely lands)

The state to maintain in memorization table is a minimum number of attemps. For example, table[i][j] expresses the minimum attemps at i eggs and j-th floor.

table[i][j] will be calcuated by:


min(1 + max(table[i - 1][k - 1], table[i][j - k])) where k = 1 to j
            ^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^
                  breaks          doesn't break

Java code for finding the highest safe floor

Above prints:


8

Time complexity: O(nk^2), n: eggs, k: floors

Problem Description - Finding a Celebrity

This problem also has a lot of descriptions like egg dropping problem. The details are:

  • n people come to a party
  • one of them is a celebrity either he or she
  • this only one celebrity does not know anyone in the party
  • all n - 1 people know who is the celebrity
  • only one available question is “does A know B?”
  • boolean know(int A, int B) method is proveded which returns true if A knows B

Given above conditions, “find the celebrity in the minimum number of questions” is the problem.

The idea to find the celebrity

The problem describes relations between people. If I draw the relations, it will be a directed graph of n people (n nodes). The celebrity node has an out-degree zero and in-degree n - 1.


              +----------------------+
              |                      |
              v                      |
 (p0) -----> (C) <----- (p2) <----- (p3)
            ^   ^^
            |   | \
            |   |   \
            |   |     \
         (p4) (p5) <--- (p6)

Given the graph above, the method, know(A, B), is the same as has an edge from A to B.

To solve this problem, a typical approach consists of two steps.

  1. Elimination step
  2. Verification step

The elimination step eliminates people who are not a celeb apprently. Here, stack is a good data structure. After pushing all poeple to the stack, run know method. If A has an edge to B, eliminates A since A is not a celeb. Also, check the edge from B to A.

The verification step verifies the last person is a celeb. This is because the elimination process may leave no celeb person in the stack. For example, a top rightmost node p3 in the graph has two outbound edges. Suppose the first question is made against the celeb (C), p3 will be removed. Later, p2 appears, and nobody says “I know p2.”

For this reason, the verification step is there to ensure the person in the stack is the celeb.

Java code for square root implementation

Time complexity: O(n), space complexity O(n)

The result is:

1

Resources

Latest Posts

Application Development by Rails Action Cable

The previous two blog posts introduced WebSocket and how to implement a WebSocket application on Ruby on Rails. This blog post digs deeper. It is a memo on creating a more realistic application by Action Cable.

Real-time App on Rails by Action Cable

The previous blog post, WebSocket on Rails by Action Cable, focused on WebSocket as a protocol. As in the previous post, by default, Rails app responds to WebSocket connection requests without any hassle. However, other than connecting and sending ping frames, it doesn’t do anything. This blog post focuses on an application side and explains how we can create a full-duplex, bidirectional app.

WebSocket on Rails by Action Cable

In the web application domain, we hear some protocol names. Absolutely, HTTP or HTTPS is the most famous protocol that all web developers know. Although there’s a mechanism of Keep-Alive, a single request/response sequence with a single client/server is all done by HTTP. The client initiates the HTTP request to the server. Once the client receives the HTTP response from the server, communication finishes. As far as HTTP is used, the server just waits and waits. Only when the request comes in, the server can send back some data to the client. This communication style is surprisingly capable of doing many things, so most web applications are satisfied with HTTP.