The attacker do not brute force the entire search space for breaking the passwords. The attacker begins by trying the dictionary which is the collection of the most probable passwords.
Let us consider 3 attacks, according to the strategy used to protect the password database.
case 1: Passwords protected with Hash.
For every word 'w' in the dictionary
i. Compute the hash of 'w'.
ii. Compare the hash with the entries in the password database.
In this case the same dictionary can be used to break the entire password database.
case 2: Passwords protected with Salted Hash.
For every word 'w' in the dictionary
i. Append the salt 's' to 'w'.
ii. Compute the hash of 'w'+'s'.
iii. Compare the hash with the password to be broken.
In this case, the attacker has to modify his dictionary according to salt used for hashing the password. Thus the same dictionary can not be used to break the passwords. The salt is not known in advance and if the size of salt is say 32 bits, pre-computation of the dictionary can also be prevented.
case 3: Passwords protected with Microsoft scheme.
For every word 'w' in the dictionary
i. Decrypt the 'N+M' bytes using 'w'.
ii. Hash the N bytes.
iii. Compare the hash with 'M' bytes.
In this case the value of N is not known in the advance and the attacker can compute the encrypted version of 'N'+'M' using every word in the dictionary and for the every possibility of 'N'. However, if the size of 'N' is large, then the pre-computation of the dictionary can be prevented.
Analogously, random 'N' in the Microsoft Scheme serves the same purpose as that of the random salt 's' in the salted hash. However, if the same value of 'N' is used for protecting every password in the database, then it's security is equivalent to the passwords protected with hash(case 1).