The actual resource that you should look for on that thread that Álvaro posted is his own post, number 6.
When it's 2D, it considers the trajectory of the target as a line, and the possible directions of the bullet as a circle: The circle is intersecting the line at two points, behind and ahead of the target. You regard the point ahead, that the target will travel to in the future.
When it's 3D, the target is travelling in a 3D line, and the possible directions of the bullet form a sphere. The sphere intersects with that line at two points as well.
While that method is the fastest you can get, there's another one that's very clever and you should take a look at. It makes use of a coordinate space where the Y axis is aligned to the distance between the two objects: http://stackoverflow.com/a/2248934
In this method, the Y component of the vectors brings the objects closer together and the X component makes them stay synchronized while travelling.
So the X components of both objects are equal, and you use that to calculate the bullet's Y component based on the "length" of the speed vector for the bullet:
speed.Y = Sqr( speed.length² - speed.X² )
Then you transform these X and Y components from that coordinate space to the screen space and you have the vector that the bullet should travel by.