Algorithm to apply permutation in constant memory space

后端 未结 8 1566
温柔的废话
温柔的废话 2020-12-13 21:29

I saw this question is a programming interview book, here I\'m simplifying the question.

Assume you have an array A of length n, and you ha

8条回答
  •  旧巷少年郎
    2020-12-13 22:01

    Just a simple example C/C++ code addition to the Ziyao Wei's answer. Code is not allowed in comments, so as an answer, sorry:

    for (int i = 0; i < count; ++i)
    {
        // Skip to the next non-processed item
        if (destinations[i] < 0)
            continue;
    
        int currentPosition = i;
    
        // destinations[X] = Y means "an item on position Y should be at position X"
        // So we should move an item that is now at position X somewhere
        // else - swap it with item on position Y. Then we have a right
        // item on position X, but the original X-item now on position Y,
        // maybe should be occupied by someone else (an item Z). So we
        // check destinations[Y] = Z and move the X-item further until we got
        // destinations[?] = X which mean that on position ? should be an item
        // from position X - which is exactly the X-item we've been kicking
        // around all this time. Loop closed.
        // 
        // Each permutation has one or more such loops, they obvisouly
        // don't intersect, so we may mark each processed position as such
        // and once the loop is over go further down by an array from
        // position X searching for a non-marked item to start a new loop.
        while (destinations[currentPosition] != i)
        {
            const int target = destinations[currentPosition];
    
            std::swap(items[currentPosition], items[target]);
            destinations[currentPosition] = -1 - target;
    
            currentPosition = target;
        }
    
        // Mark last current position as swapped before moving on
        destinations[currentPosition] = -1 - destinations[currentPosition];
    }
    
    for (int i = 0; i < count; ++i)
        destinations[i] = -1 - destinations[i];
    

    (for C - replace std::swap with something else)

提交回复
热议问题