Более быстрая перестановка строк

У меня есть методы перестановки

public void permute(String str) {
    permute(str.toCharArray(), 0, str.length() - 1);
}

private void permute(char[] str, int low, int high) {
    if (low == high) {
        writeIntoSet(new String(str, 0, length));
    } else {
        for (int i = low; i <= high; i++) {
            char[] x = charArrayWithSwappedChars(str, low, i);
            permute(x, low + 1, high);
        }
    }
}

private char[] charArrayWithSwappedChars(char[] str, int a, int b) {
    char[] array = str.clone();
    char c = array[a];
    array[a] = array[b];
    array[b] = c;
    return array;
}

Но когда я помещаю в этот метод строку длиной 10 символов, получается 10! комбинаций, и это занимает так много времени. Есть ли возможность как сделать быстрее?

ИЗМЕНИТЬ

Мне нужно сделать перестановки из 10 букв, но после этого я ищу эти "слова" в словаре. Например у меня - CxRjAkiSvH и мне нужны слова CAR, CARS, CRASH и т.д. Есть ли вариант производительности?


person medy75    schedule 09.06.2012    source источник
comment
Используйте цикл вместо рекурсии   -  person Jeffrey    schedule 09.06.2012
comment
Сколько перестановок вы хотите, если строка состоит из 10 букв?   -  person esej    schedule 09.06.2012
comment
вместо того, чтобы создавать большой набор, вы можете обрабатывать каждый результат по мере его получения с помощью интерфейса прослушивателя.   -  person Peter Lawrey    schedule 09.06.2012
comment
Вам не нужно клонировать массив символов. Поменяйте местами символы, сделайте свое дело, поменяйтесь местами. Это должно быть хотя бы немного быстрее.   -  person Piotr Praszmo    schedule 09.06.2012


Ответы (2)


Существуют существующие алгоритмы для создания перестановок, которые могут быть немного более эффективными, чем тот, который вы используете, поэтому вы можете взглянуть на один из них. В прошлом я использовал алгоритм Джонсона-Троттера, который немного ускоряется за счет внесения минимально возможных изменений для получения следующей перестановки каждый раз. Я не знаю, с какими ограничениями вы должны работать, но если вам не нужно использовать Java, возможно, лучше этого не делать. Это просто не будет самым быстрым для этого. Особенно, если ваш алгоритм использует рекурсию. Как подсказал кто-то другой, если вы придерживаетесь этого алгоритма, вам лучше всего отказаться от рекурсивного подхода и попробовать использовать цикл.

person nbrooks    schedule 09.06.2012
comment
Это должно быть java, потому что мне нужно использовать его в приложении для Android :) Это достаточно быстро на ПК, но на телефоне нет. Итак, я попробую цикл. - person medy75; 09.06.2012

Для строки из 10 символов их 10! перестановки, нет двух способов обойти это. Возможно, вы сможете сделать это немного быстрее, добавив вместо этого StringBuffers или используя char[] вручную.

person Kevin    schedule 09.06.2012