Posts tagged Personal

Why iPhone still ruleZ

I’m going to make a simple point. And because people that know me think I’m a “unfair-Google-aficionado-that-doesn’t-see-how-evil-Google-is”, I’m going to use Android as victim here.

iPhone ruleZ
iPhone ruleZ

Other OS? I’m not even taking into consideration old stuff like Symbian: is just too easy to trash it now-days (Qt is a whole different story though).
More >

Binary Tree Rebuilder

Imagine you have a Binary Tree, with those characteristics:

  • Nodes do not respect any order relation – In other words: it’s not a Binary Search Tree of any kind
  • Every node appears once and only once within the tree
A nice Binary Tree
A nice Binary Tree

Then, your little brother passes by your desk and, to upset you, deletes the tree from your computer memory/HD (yeah, I know, I’m pathetic at inventing hypothetical situations :-P ).

Fortunately though, you previously did a Pre-Order and an In-Order visit of your tree, and stored the result in an 2 nice array.

Can you rebuild the original tree structure out of this 2 array?

How are you going to rebuild it?

Yes, you can! (Sorry, I couldn’t resist). And it’s quite easy as well. What you have to do, is the following:

  • Take the first element of the PreOrder Array and use it as root of a new tree
  • Find the position of this New Node in the InOrder Array, scanning it from 0 to n-1 (n is the number of Nodes)
  • IF next element in the PreOrder Array is on the left of the New Node in the InOrder array: call RECURSIVELY this procedure, this time taking into account the portion of InOrder array that goes from 0 to the position of the New Node in the InOrder Array -1.
  • IF next element in the PreOrder Array is on the right of the New Node in the InOrder array: call RECURSIVELY this procedure, this time taking into account the portion of InOrder array that goes from the position of the New Node in the InOrder Array +1 to n-1.
  • Return the New Node

By the way, this doesn’t work. To fix it we should be more generic, specifying things a little bit better. Things like:

  • Every recursive calls takes into account a portion of the InOrder array; in the case of the first call it’s the entire array
  • There is going to be as much recursive calls as the number of elements in the PreOrder array

Of course, is a tree what we are talking about here: recursion is a MUST. More >

iPad Simulator in Video and Comments

I would have just posted it on Twitter, but I have some comments about this video.


One of the first video of the iPad Simulator
  1. Watch it in Full screen at 720p: it help “feeling” the proportions used by Apple in the UI
  2. It clarify how it does execute iPhone apps: they most probably implement the iPhone API as is: indeed even the Keyboard that you get in an iPhone application is the same (no super large/super cool keyboard of the iPad
  3. I feel that 4 icons per row are too few: there a kilometers between an icon and the next one
  4. I feel that the hardware home button doesn’t fit very well proportionally: they should have used a rectangular button way larger: given the size of the device, is too small
  5. The amount of free space in the top bar (the one with Battery, Time and Signal Strength) is A JOKE. In there nice little icons of the services running in background, or tickers of latest emails… or something else SHOULD fit
  6. Integrated Spotlight is a proportional abomination: why the search bar in the TOP has the fixed size of the one used by iPhone? I mean, it takes not even half of all the width it could
  7. Notification Modal Dialogs (used to ask stuff like “Are you sure you want to delete this app?”) is SO SMALL, that in the middle of the screen looks like you should do something else around it. EVEN with the background faded in black: I believe such effect of “prioritization” works as long as the user can’t have something else to look at.
  8. File Sharing!!! It misses a proper Finder Mobile to share files through Bluetooth, USB, Wifi, as well as management of those files! I don’t want to email me stuff! And I don’t want to pay for an extra software that is not well integrated or it has always some limitations.

That’s my first set. But surely I’ll have more. I need to collect reasons to stick with my position: iPass. ;)

Prime Numbers Generator

I believe I don’t have to describe what primes are, what are their properties and what not. This post is more a tribute to geek-ness of 2 friends-and-colleagues (@lucabox) that have fun thinking of algorithms to solve stupid (or less stupid), and always useless problems ;-) .

Optimus Prime
Optimus Prime :-P – yeah yeah, a stupid joke

Briefing

This code is based on the assumption that we want to generate very very large primes, so it uses unsigned long long to store the values, instead of classical unsigned int. Live with that.

Also, give that there is nothing much better then a “try-dividing-by-every-previous-prime” out there (there are alternatives, but I’m not aware of more complex ones), I took a look to some properties of Primes, and putted into the algorithm those properties as conditions for early stop:

  1. Say P[i] are the previously calculated Primes; If trying dividing value V by every P[i] we find that P[i] > sqrt(V), stop dividing and classify V as a newly found prime
  2. No need to check any even number: they are divisible by 2, so no primes by definition
  3. No need to allocate more space then an array of the size of the requested prime ordinality: everything can be done in place

More >

Use Backtracking to print all Subsets

I’m “studying” this algorithmic technique: Backtracking. This is an algorithmic approach to problem solution that I trust every good Computer Scientist already uses; but taking a good theo-practical look at it is something better.

A Backtracking Tree
A Backtracking Tree

I believe you can find enough informations about it online (the 2 links I provided are more than enough), so I’ll go straight to the problem.

Problem definition

Given an integer n, and the set S = { 1 ... n }, calculate (print) all the possible subsets of S. For example, for n = 1, all the possible subsets are { 1 } and { } (empty set). For n = 2, all the possible subsets are: { 1 2 } { 1 } { 2 } { }. In general, for the set made of the first n Integers, the number of possible subsets is 2n.

Approaching the problem

A way to describe a possible subset is an array of n elements, one for every integers; every element in the array will have value TRUE if the correspondent integers is part of the subset, FALSE otherwise.

Why the Backtracking then? Because the backtracking technique is designed to generate every possible “candidate solution” once. If we design the algorithm smartly, we can get the backtracking logic to work for us and generate all the possible subsets.

Are you are asking yourself: “isn’t this a bit of a stretching of the backtracking approach?”. I believe it is: the code could be made way smaller, even though it would have the same complexity. We are going to execute the backtracking, designing the algorithm so it will never stop until it tried every possible solution. No “intermediate stopping condition” then.

More >

Money change problem: Greedy vs. Dyn.Pro.

This is a classical problem of Computer Science: it’s used to study both Greedy and Dynamic Programming algorithmic techniques.

Coins
I hate having my pocket full of copper!!! -_-

Definition

Given:

  • A set of n Denominations D[0...n-1] in ascending order, representing a Monetary Coin System
  • An money amount A, as input

calculate a solution:

  • S[0...n-1], with 0 <= S[i] <= (A/S[i]) and 0 < i < n-1

where:

  • A = Sum[i=0 -> n-1] { D[i] * S[i] }
  • Min{ Sum[i=0 -> n-1] { S[i] } }

In other words

Find the smallest amount of coins to make the given amount. More >