Diferente pentru blog/meet-in-the-middle intre reviziile #91 si #123

Diferente intre titluri:

Coding contest byte: Meet in the middle
Coding contest trick: Meet in the middle

Diferente intre continut:

Meet in the middle (sometimes called split and merge) is a clever idea that uses caching to get more efficient solutions. Much like divide et impera it divides the problem in two and then tries to merge the results. The benefit is that by using quite a bit of extra memory you can tackle problems of twice the size you could before.
Meet in the middle (sometimes called split and merge) is a clever idea that uses caching to get efficient solutions. Much like divide et impera it splits the problem in two and then tries to merge the results. The benefit is that by using quite a bit of extra memory you can tackle problems of twice the size you could before.
Let's go through a few applications.
Before we go on I want to mention that the additional problems are the best part of the article. Now let's go through a few applications of the trick.
h2. 4sum
h2. 4sum (popular interview question)
bq. Given A, an array of integers, find out if there are any four numbers in the array that sum up to zero (the same element can be used multiple times). For example given A = [2, 3, 1, 0, -4, -1] a solution is 3 + 1 + 0 - 4 = 0 or 0 + 0 + 0 + 0 = 0.
bq. Given A, an array of integers, find out if there are any four numbers in the array that sum up to zero (the same element can be used multiple times). For example given A = [2, 3, 1, 0, -4, -1] a solution is 3 + 1 + 0 - 4 = 0 or 0 + 0 + 0 + 0 = 0.
The naive algorithm checks all four number combinations. This solution takes $O(N^4^)$ time.
== code(c) |
def 4sum(A):
  S = {}
  sums = {}
  for a in A:
    for b in A:
      S[a + b] = (a, b)
      sums[a + b] = (a, b)
  for c in A:
    for d in A:
      if -(c + d) in sums:
        print (S[-(c + d)][0], S[-(c + d)][1], c, d)
        print (sums[-(c + d)][0], sums[-(c + d)][1], c, d)
        return
  print "No solution."
==
This algorithm has $O(n^2^)$ time and space complexity.
This algorithm has $O(n^2^)$ time and space complexity. There's no known faster algorithm for this problem.
 
h2. Bidirectional search
 
bq. Find the shortest path between two nodes nodes in a large graph, for example the Facebook friendship graph.
 
!blog/meet-in-the-middle?12fig26.gif!
 
'img source':http://goo.gl/6zne3
 
The breadth first search algorithm is a standard approach for this problem. If the distance between two nodes is $k$ and the average degree in the network is $p$ BFS explores $O(p^k^)$ nodes.
 
A better solution starts from both nodes and sees when the two search frontiers meet.  This reduces the number of states explored to $O(p^k/2^)$.
 
The approach works well with both path finding problems on explicit graphs and with implicit state graphs like the ones you find in games.
h2. Breaking 2DES
!<blog/meet-in-the-middle?2des.png 70%!
DES is an encryption standard which uses 56 bit keys. Today computers can use a brute force approach to break the encryption. One simple approach to make the encryption more secure is to apply it twice, using two different keys. This approach is susceptible to the meet in the middle attack developed by Diffie Hellman. 3DES is less susceptible as it encrypts the message three times using 3 keys.
DES is an encryption standard which uses 56 bit keys. Today computers can use a brute force approach to break the encryption. One simple approach to make the encryption more secure is to apply it twice, using two different keys. This approach is susceptible to the meet in the middle attack developed by Diffie-Hellman. 3DES works around this problem by encrypting the message 3 times using 2 keys.
Let’s see why 2DES is vulnerable. Let $Ek$ be the encryption function using the secret key $k$ and $Dk$ the decryption function using the secret key $k$. 2DES uses $Ek1(Ek2(p)) = s$ to encrypt and $Dk2(Dk1(s)) = p$ to decrypt.
Let’s see why 2DES is vulnerable. Let $Ek$ be the encryption function using the secret key $k$ and $Dk$ the decryption function using the secret key $k$. 2DES uses two keys, k and K. Ek&#40;EK&#40;p)) = s does the encryption and DK&#40;Dk&#40;s)) = p does the decryption.
Diffie Hellman’s meet in the middle attack trades off space for time to find out the two secret keys.
For the pattern p it tries all the possible keys to obtain a set of numbers corresponding $Ek(p)$. Also for the pattern s it uses all the possible keys to decrypt s, $Dk(s)$.
If we find any match in the two sets it means that $Ek1(p) = Dk2(s)$ so the secret keys are k1 and k2.
The naive brute force algorithm does $2^56^ * 2^56^$ iterations going through all possible values of k1 and k2 while this algorithm uses $2^56^ * 56$ memory to store $Ek(p)$ and does $2^56^$ work to find a match.
Diffie-Hellman’s meet in the middle attack trades off space for time to find out the two secret keys.
For the pattern p it tries all the possible keys to obtain a set of numbers corresponding Ek(p). Also for the pattern s it uses all the possible keys to decrypt s, Dk(s).
If we find any match in the two sets it means that Eki(p) = Dkj(s) so the secret keys are ki and kj.
The naive brute force algorithm does $2^56^ * 2^56^$ iterations going through all possible values of k1 and k2 while this algorithm uses $2^56^ * 56$ memory to store all Eki(p) and does $2^56^$ work to find a match.
This is quite a bit of space and quite a bit of computation time. But a for a large enough company or country it starts being within the realm of posibility.
 
The problem DOUBLE the International Olympiad in Informatics 2001 was basically asking to break 2DES for keys of size 24 which is quite feasible.
h2. Discrete logarithm
The naive solution goes through all possible values of k and takes $O(n)$ time.
The baby-step, giant-step algorithm solves the problem more efficiently using the meet in the middle trick.
Let's write k = $i([sqrt(n)] + 1) + j$
Let's write k = $i[sqrt(n)] + j$
Notice that $i <= sqrt(n)$ and $j <= sqrt(n)$.
Replacing k in the equality we get $p^(i ([sqrt(n)] + 1) + j)^ = q (mod n)$.
Dividing by $p^j^$ we get $p^(i[sqrt(n)] + 1)^ = qp^-j^ (mod n)$.
Replacing k in the equality we get $p^(i[sqrt(n)] + j)^ = q (mod n)$.
Dividing by $p^j^$ we get $p^i[sqrt(n)]^ = qp^-j^ (mod n)$.
At this point we can brute force through the numbers on each side of the equality and find a colision.
The algorithm takes $O(sqrt(n))$ space and $O(sqrt(n))$ time.
h2. Bidirectional search
 
bq. Find the shortest path between two nodes nodes in a large graph which you can’t keep in memory, for example the Facebook friendship graph.
 
!blog/meet-in-the-middle?12fig26.gif!
 
The breadth first search algorithm is a standard approach for this problem. If the distance between two nodes is $k$ and the average degree in the network is $p$ BFS explores $O(p^k^)$ nodes.
 
A better solution starts from both nodes and sees when the two search spaces meet.  This reduces the number of states explored to $O(p^k/2^)$.
 
The approach works well with both path finding problems on explicit graphs and with implicit state graphs like the ones you find in games.
 
h2. Caveats
Unlike divide and conquer meet in the middle can't be applied recursively because the sub problems don't have the same structure as the original problem.
h2. Additional problems
# *Friend of a friend*(interview question) Given two user names in a social network find design an efficient way to test if one is a friend of a friend of the other.
# *Friend of a friend*(interview question) Given two user names in a social network design an efficient way to test if one is a friend of a friend of the other.
# *6 degrees of separation* Given two user names in a social network design an efficient way to test if they are at most 6 friends apart.
# *Equal partition* Given a set A of 40 real numbers, find out if there is any way to split A in two sets such that the sums of their elements are equal. (Hint: complexity $O(2^n/2^)$)
# *Minimal vertex cover* Given a graph of n nodes (n <= 30), find out a set with the smallest number of vertices such that each edge in the  graph has at least one node inside the set. (Hint: complexity $O(3^n/2^)$)
# *Square* You're given an array L which represents the sizes of n planks. You have to answer if there's any way to form a square using the planks without breaking them of overlapping them. (Hint: complexity $O(4^n/2^)$)
# *Square fence* You're given an array L which represents the lengths of n planks. You have to answer if there's any way to form the edges of a square fence using all the planks without breaking or overlapping them.  (Hint: complexity $O(4^n/2^)$)
# *8 puzzle* The 8 puzzle is a sliding tile game of 3x3 slots with 8 tiles and one empty slot. At each step you can move one of the orthogonally neighbouring tiles to the empty slot. The game starts from a random initial configuration and the purpose is to get to the final sorted configuration in the fewest number of moves. Figure out an efficient algorithm that solves the 8 puzzle. (Hint: Each position is solvable in at most 31 moves) In the picture we see a sequence of moves that solves the puzzle.
!blog/meet-in-the-middle?8puzzle.png!
# *4 reversals* We are given two equal length strings S and T. Figure out if we can get string T starting from string S and applying 4 substring reversal operations. (Hint: complexity O(n^5^))
Try the to solve these problems in the comment section.
Try to solve them in the comment section.

Diferente intre securitate:

private
protected

Diferente intre topic forum:

 
8222