Finding n-th permutation without computing others
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
Finding the n-th permutation of a sequence is a fascinating problem that can be addressed without computing all preceding permutations. This technique is particularly useful in situations where the sequence's size is large, making it computationally expensive to generate all permutations.
Understanding Permutations
A permutation is a specific arrangement or ordering of a set of objects. For a given list of `n` distinct integers, the total number of permutations is `n!` (n factorial), where each permutation is a unique sequence of these integers.
Key Concept: Factorial Number System
The factorial number system is an essential concept for finding the n-th permutation without iterating through all possibilities. It involves expressing a number in a mixed radix numeral system where the bases are successive natural numbers.
For example, consider the number 100 in base 10: • In the factorial number system, it could be represented depending on the context (e.g., the permutation sequence).
This concept allows us to map a unique index to a specific permutation of a sequence.
Steps to Find the n-th Permutation
Let's derive the approach using an example. Suppose we have a sequence, [1, 2, 3, 4], and we want the 14th permutation in lexicographical order.
Step-by-Step Process
- Determine Factorials: Calculate factorials up to `(n-1)!`. For the sequence [1, 2, 3, 4]: • , , , .
- Zero-Based Index: Convert the problem into a zero-based index by subtracting 1. For the 14th permutation, the index is `13`.
- Find Each Digit: • Use the factorials to select elements in each position. • For a zero-based index of 13 on [1, 2, 3, 4]: • Find the count for each position using the factorial numbers.
Example Calculation
• First position: With 4 choices (1, 2, 3, 4): • `index = 13`, divide by `3! = 6`: `13 / 6 = 2` (integer division). • Element at index 2 in [1, 2, 3, 4] is `3`. • Update index: `13 % 6 = 1`.
• Second position: Remaining elements [1, 2, 4], `index = 1`: • Divide by `2! = 2`: `1 / 2 = 0`. • Element at index 0 is `1`. • Update index: `1 % 2 = 1`.
• Third position: Remaining elements [2, 4], `index = 1`: • Divide by `1! = 1`: `1 / 1 = 1`. • Element at index 1 is `4`. • Update index: `1 % 1 = 0`.
• Fourth position: Last remaining element [2]: • As there's only one choice, the last element is `2`.
Thus, the 14th permutation is `[3, 1, 4, 2]`.
Key Points
| Factorial Calculation | Zero-Index Adjustments | Element Selection |
| Calculate up to | Subtract 1 to convert to zero-based index | Use integer division and modulo to choose elements at each step |
| Example: | For 14th: 14 - 1 = 13 | Example order for [1, 2, 3, 4]: [3, 1, 4, 2] |
Additional Insights
Lexicographical Order
Permutations are often sought in lexicographical order, equivalent to dictionary order when considering sequences of letters or numbers. The process outlined here guarantees that the permutations are generated directly in this order.
Computational Complexity
The complexity of this method is due to repetitive list manipulations and factorial calculations but is significantly more efficient than generating all permutations which would be .
Applications
- Password and Security Systems: Calculating permutations without generating all variations helps in cryptographic algorithms.
- Combinatorial Problems: Used in configurations and optimizations of routes, schedules, and logistical planning.
Limitations
While this technique is optimal for smaller sequences, calculating factorials can become infeasible for very large series due to the rapid growth of the factorial function. Optimizations and efficient storage techniques are required for handling larger sequences.
In conclusion, the ability to find the n-th permutation directly gives a substantial performance boost in various fields, particularly where the need for efficient data manipulation is critical. Understanding and leveraging advanced number systems like the factorial number system allows for elegant and efficient solutions to what might otherwise be intractable computational problems.
Related reading
- Finding nearest free position for a circle for any point x,y in a 2D space with circles
- Finding nearest point in an efficient way
- Finding neighbourhoods cliques in street data a graph
- Finding number of concurrent events given start and end times
- Finding number of overlaps in a list of time ranges
- Finding pairs with product greater than sum
- Finding number of nodes within a certain distance in a rooted tree
- Finding number of subarrays whose sum equals k

DSA Fundamentals
Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.