Basically, if you have the following namespace/location registered:
'App\Frontend' => '../app/frontend/'
the process made by the auto-loader if the class to load is App\Frontend\Controllers\MyController is:
1) Traverse all the registered namespaces
2) Check if the class name to load start with one of the registered namespace prefixes
3) If a prefix is found then the prefix is removed from the beginning of the string, in our case: App\Frontend\Controllers\MyController - App\Frontend = Controllers\MyController
4) The path related to the prefix is prepended to the string generated in step 3 plus the .php extension resulting in '../app/frontend/' + Controllers/MyController + .php = '../app/frontend/Controllers/MyController.php
5) The auto-loader checks if this file exists, if yes, the file is required, otherwise try with another prefix
As seen above, the path contains the "Controllers" word with the first letter as it is in the class name, if a developer wants another name, for example: "controllers" in lowercase, it's necessary register a specific path for it: 'App\Frontend\Controllers' => '../app/frontend/controllers/'.
The idea behind using this auto-loader is reduce the number of stats performed in each request, a higher number of prefixes registered don't affect performance, but a high number of stats made (access the filesystem) lead to a bad performance. According to the steps mentioned above, just one stat was performed which is good.