Thank you for your detailed explaination.

  But I also have some question: why does the problem tell us to note that
it would take O(nlogn) time to read the full array ?  How can we calculate
that  reading the full array ( in binary form) is O(nlogn) ?

2010/11/6 Dave <dave_and_da...@juno.com>

> @Cheng: This is the "divide" of divide and conquer. In more detail,
> the numbers from 0 to 2^k - 1 have 2^(k-1) zeros and 2^(k-1) ones in
> each bit position. E.g., let k = 3. Then the numbers are
> 0=000
> 1=001
> 2=010
> 3=011
> 4=100
> 5=101
> 6=110
> 7=111
> Notice that there are 4 zeros and 4 ones in each bit position. If we
> have 2^k - 1 distinct numbers from 0 to 2^k - 1, then there one of the
> numbers from 0 to 2^k - 1 is missing. That number will have either a
> zero or a one in the leftmost bit position. So when you make a list of
> the numbers with a zero bit in the leftmost position and another list
> of the numbers with a one bit in the leftmost position, one of those
> lists will have 2^(k-1) numbers and the other list will have 2^(k-1) -
> 1 numbers. The shorter list would be filled out to length 2^(k-1) if
> the missing number were not missing.
>
> Let's take a look at the entire algorithm. Suppose k = 3 and the
> number 5 is missing, with the rest of the numbers in "random" order:
> a[0]=010
> a[1]=111
> a[2]=001
> a[3]=000
> a[4]=110
> a[5]=011
> a[6]=100
> Then the list of indices of the numbers with a zero leftmost bit is
> {0,2,3,5}, and the list of indices of the umbers with a one leftmost
> bit is {1,4,6}. The list of indices of the numbers with the leftmost
> one bit is the shorter list, so record that the leftmost bit of the
> missing number is 1, and discard the longer list.
>
> Now analyze the second bit of the numbers whose indices are in the
> remaining list: The list of indices of the numbers with a zero bit in
> the second position is {6}, and the list of indices of the numbers
> with a one bit in the second position is {1,4}. The first list is the
> shorter one, so note that the second bit of the missing number is 0,
> and discard the longer list.
>
> Now analyze the rightmost bit of the numbers whose indices are in the
> remaining list: The list of indices of the numbers with a zero bit in
> the rightmost position is {6}, and the list of indices of the numbers
> with a one bit in the rightmost position is {}, i.e., empty. The
> second list is the shorter one, so note that the third bit of the
> missing number is 1.
>
> Now you have all three bits of the missing number 101, so the missing
> number is 5.
>
> The work is the number of inspections of bits in the input numbers,
> which is 7 + 3 + 1 = 11. This is less that 2n. In general, for any
> number of bits, the work will be less than 2^k + 2^(k-1) + 2^(k-2)
> + ... + 2^1 + 2^0 - 2(2^k) - 1 < 2n, so the work is O(n).
>
> Dave
>
> On Nov 6, 6:18 pm, cheng lee <lichenga2...@gmail.com> wrote:
> > Hi , Dave
> > Why to do like this :"Make a list of the indices of the numbers with 0
> bits
> > and a list of
> > the indices of the numbers with 1 bits.
> > One of the lists will be of even length, and one will be of odd
> > length." ?
> >
> > 2010/11/3 Dave <dave_and_da...@juno.com>
> >
> >
> >
> >
> >
> > > @Lichenga2404:
> > > Examine the leftmost bit of each number, using n operations.
> > > Make a list of the indices of the numbers with 0 bits and a list of
> > > the indices of the numbers with 1 bits.
> > > One of the lists will be of even length, and one will be of odd
> > > length.
> > > The missing number has the leftmost bit that would cause it to be
> > > added to the odd length list.
> > > Record that bit as the leftmost bit of the answer.
> > > Discard the list with the even number of entries.
> > > Repeat the above for the second, third, etc bits from the left, using
> > > the list of indices produced in the previous iteration.
> > > After the rightmost bit is processed, the entire result has been set.
> >
> > > In each case, the list is cut in half, so the algorithm is O(n + n/2 +
> > > n/4 + ...) = O(n).
> >
> > > This works because the exclusive or of the numbers 0, 1, 2, ..., 2^k -
> > > 1 is zero. We can't compute the exclusive or directly because that
> > > would be O(n log n), so we compute it one bit at a time, operating
> > > only on the numbers that have the same leading bits as the missing
> > > number.
> >
> > > Dave
> >
> > > On Nov 3, 2:50 am, lichenga2404 <lichenga2...@gmail.com> wrote:
> > > > You are given an array A of n distinct integers , expressed in
> binary.
> > > > Each integer is in the range [0,n] .As there are n+1 values in this
> > > > range, there is exactly one number missing .As a single operation,
> you
> > > > may access the jth integer(A[i][j]) . Note that it would take
> O(nlogn)
> > > > time to read the full array.
> >
> > > >    Give an O(n) algorithm to determine which integer is missing , and
> > > > justify its correctness, You may assume that n = 2^k - 1 for some
> > > > integer k.
> >
> > > --
> > > You received this message because you are subscribed to the Google
> Groups
> > > "Algorithm Geeks" group.
> > > To post to this group, send email to algoge...@googlegroups.com.
> > > To unsubscribe from this group, send email to
> > > algogeeks+unsubscr...@googlegroups.com<algogeeks%2bunsubscr...@googlegroups.com>
> <algogeeks%2bunsubscr...@googlegroups­.com>
> > > .
> > > For more options, visit this group at
> > >http://groups.google.com/group/algogeeks?hl=en.
> >
> > --
> > licheng- Hide quoted text -
> >
> > - Show quoted text -
>
> --
> You received this message because you are subscribed to the Google Groups
> "Algorithm Geeks" group.
> To post to this group, send email to algoge...@googlegroups.com.
> To unsubscribe from this group, send email to
> algogeeks+unsubscr...@googlegroups.com<algogeeks%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/algogeeks?hl=en.
>
>


-- 
licheng

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algoge...@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to