Implement an unbiased array shuffle
Company: Sybill
Role: Software Engineer
Category: Coding & Algorithms
Difficulty: medium
Interview Round: Technical Screen
Implement an in-place function shuffle(arr) in JavaScript that returns a uniformly random permutation of the input array. The algorithm must be unbiased (all n! permutations equally likely), run in O(n) time with O(
1) extra space, and handle empty or single-element arrays. Explain your approach, justify uniformity at a high level, and analyze time and space complexity.
Quick Answer: This interview question evaluates algorithm design, data structures, correctness, complexity, edge cases, and implementation details in a realistic interview setting. A strong answer for Implement an unbiased array shuffle states assumptions, handles edge cases, explains trade-offs, and shows how to validate the result clearly.
Solution
# Solution Alignment
The prompt asks for an implementation-level answer. The safest way to present it is to define the state, maintain clear invariants, then walk through complexity and tests.
## Problem Restatement
Implement an in-place function shuffle(arr) in JavaScript that returns a uniformly random permutation of the input array. The algorithm must be unbiased (all n! permutations equally likely), run in O(n) time with O( 1) extra space, and handle empty or single-element arrays. Explain your approach, justify uniformity at a high level, and analyze time and space complexity.
## Recommended Approach
Map the desired probability distribution to numeric intervals. Precompute prefix sums for weighted choices, then draw a uniform random value and binary-search the first prefix that covers it. For uniform geometric sampling, choose the object proportional to its area and then sample coordinates uniformly inside it.
## Correctness
The implementation should maintain an invariant after each loop or operation that directly matches the problem statement. At termination, that invariant implies the returned value has considered every valid candidate exactly once, or has preserved the required data-structure state after every API call.
## Complexity
Prefix-sum preprocessing is O(n) time and O(n) space; each pick is O(log n). Alias sampling can reduce picks to O(1) when preprocessing is worthwhile.
## Edge Cases and Tests
Single item, invalid zero/negative weights, very large totals, deterministic seeds in tests, and empirical distribution checks.