Вам нужно больше думать о вашем алгоритме.

аюсь написать программу, которая будет генерировать текстовый файл с каждой возможной перестановкой алфавита от одного символа до двадцати девяти символов. Я выбрал 29 как самое длинное английское слово, которое все знают, это antidisestablishmentarianism длиной 28 символов. Есть более длинные, но они в основном очень технические и неясные.

Я понимаю, что это будет генерировать огромное количество строк. Однако я не знаю, с чего начать и даже как выяснить, сколько комбинаций это сгенерирует.

Ответы пожалуйста за решения в PHP,обработка, C ++ или Java (я только знаком с ними, PHP предпочтительнее, но, вероятно, не лучший для этого, я должен представить).

Или даже просто псевдокод / ​​идеи будут оценены.

Кроме того, прежде чем кто-то это скажет, это не для грубого принуждения или чего-то в этом роде. Я художник, хотя и немного неизвестный и не совсем понимающий мои концепции.

 logic-unit06 янв. 2011 г., 00:09
Ой. Один на будущее, я думаю.
 EboMike06 янв. 2011 г., 00:05
Я надеюсь, вы понимаете, насколько большим будет этот текстовый файл. Лучше купить еще несколько жестких дисков.
 thirtydot06 янв. 2011 г., 00:07
Объединенное пространство хранения всей нашей планеты не может хранить этот список.
 Tony Park06 янв. 2011 г., 00:32
Поскольку это арт-проект, возможно, результат не нужно хранить. Возможно, он мог вспыхнуть светодиодом, направленным на Большое Магелланово Облако или что-то в этом роде?
 Matteo Italia06 янв. 2011 г., 00:16
Мы говорим оперестановки одного слова иликомбинации букв алфавита? Из вопроса мне не понятно.

Ответы на вопрос(13)

http://www.merriampark.com/perm.htm.

Однако, как он упоминает

  //-----------------------------------------------------------
  // Constructor. WARNING: Don't make n too large.
  // Recall that the number of permutations is n!
  // which can be very large, even when n is as small as 20 --
  // 20! = 2,432,902,008,176,640,000 and
  // 21! is too big to fit into a Java long, which is
  // why we use BigInteger instead.
  //----------------------------------------------------------

Так как вашn 29, вы будете ждать очень долго. Это слишком большой, как EboMike пытается сказать вам в своих комментариях.

 logic-unit06 янв. 2011 г., 01:04
Да, я знал, что это будет большим. Не совсем понял, насколько большой. Я уверен, что это возможно, чтобы отобразить эту информацию в какой-либо форме. Это может быть более сложной задачей, нежели генерировать комбинации.
public class hii {  

public static void main(String[] args){

    String[] database = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};

    for(int i=1; i<=database.length; i++){
        String[] result = getAllLists(database, i);
        for(int j=0; j<result.length; j++){
            System.out.println(result[j]);
        }
    }



}


    public static String[] getAllLists(String[] elements, int lengthOfList)
    {
        //initialize our returned list with the number of elements calculated above
        String[] allLists = new String[(int)Math.pow(elements.length, lengthOfList)];

        //lists of length 1 are just the original elements
        if(lengthOfList == 1) return elements; 
        else {
            //the recursion--get all lists of length 3, length 2, all the way up to 1
            String[] allSublists = getAllLists(elements, lengthOfList - 1);

            //append the sublists to each element
            int arrayIndex = 0;

            for(int i = 0; i < elements.length; i++){
                for(int j = 0; j < allSublists.length; j++){
                    //add the newly appended combination to the list
                    allLists[arrayIndex] = elements[i] + allSublists[j];
                    arrayIndex++;
                }
            }
            return allLists;
        }
    }






}

как указал вервидот, у вас не хватило бы времени на это.

Просто генерация (и не сохранение) всех 6-буквенных вариантов заняла на моем компьютере 24 секунды:

$ time perl letters.pl

real    0m24.837s
user    0m24.765s
sys     0m0.030s

Что составляет 7,7 × 10 ^ -8 с на слово. Это означает, что для этого потребуется 8,4 × 10 ^ 33 с или 2,6 × 10 ^ 26 лет.

Вам нужно больше думать о вашем алгоритме.

который я могу придумать, - получить каждую перестановку от 1 до 29 символов в псевдокоде:

loop from i = 1 to 26^29 or 27^29 if you want to include spaces
{
   convert i to base 26 or 27;
   translate each number to the corresponding letter;
}

которая создает слова путем подсчета в Base 26:

#include <string>
#include <iostream>

int main(void)
{
    //----------------------------------------------------------
    //  Print permuations of strings of letters up to length 5.
    //  Use base 26 arithmetic.
    //----------------------------------------------------------
    const unsigned int MAX_ITERATIONS = 26 * 26 * 26 * 26 * 26;

    std::string word = "A";
    for (unsigned int i = 0; i < MAX_ITERATIONS; ++i)
    {
        //------------------------------------------------------
        //  Print the word
        //------------------------------------------------------
        std::cout << word << std::endl;

        //------------------------------------------------------
        //  Increment the word, using base 26 arithmetic.
        //  A, B, C, ..., Z.
        //  AA, BA, CA, ..., ZA, AB, BB, CB, DB, ..., ZZ.
        //  AAA, BAA, CAA, ..., ZAA, ABA, BBA, CBA, DBA, ..., ZZZ.
        //------------------------------------------------------
        bool            carry_generated = false;
        unsigned int    digit = 0;
        do
        {
            carry_generated = false;
            if (word[digit] < 'Z')
            {
                ++word[digit];
                break;
            }
            word[digit++] = 'A';
            if (word.length() == digit)
            {
                word += "A";
                break;
            }
            carry_generated = true;
        } while (carry_generated && (digit < 5));
    }

    return 0;
}

Количество напечатанных слов можно уменьшить, проверив список слов (например, словарь) перед печатью. Если слово есть в списке слов, распечатайте его.

Самая большая проблема с длиной слова 29 представляет количество. Количество переполняет диапазон стандартных целых чисел без знака C ++.Big Int библиотека должна быть использована.Следующая проблема - время, необходимое для обработки каждой комбинации. Умножьте количество на 1 микросекунду за итерацию (в худшем случае) и уменьшите до дней, часов, минут и секунд. Возможно, могут потребоваться годы.

 logic-unit06 янв. 2011 г., 01:00
Спасибо Томас, это отличный ответ. Да, я не думал, что он превышает целую длину.
 Thomas Matthews06 янв. 2011 г., 01:05
Моя приблизительная оценка составляет 8,9E + 29 лет, принимая 1 микросекунду за итерацию и в общей сложности 26 ^ 30 (от 26 до степени 30) итераций (она должна быть меньше на одну, но это незначительно в таком большом числе). Я могу ошибаться...

что внешний цикл for предназначен для количества символов в вашем слове. Затем вы просто создаете строки с такой длиной. Для длины 5 вы начинаете с «AAAAA», затем «AAAAB», «AAAAC».

Как только вы нажмете «Z», вы вернетесь назад и передвинете персонажа влево вверх, то есть «AAAAZ» станет «AAABA», а «AAAZZ» станет «AABAA». Как только вы нажмете «ZZZZZ», вы закончите с внутренним циклом, и внешний цикл начнется с «AAAAAA».

 EboMike06 янв. 2011 г., 00:23
Да, то же самое, что считать от 1 до 999999, за исключением того, что вы используете буквы в качестве цифр.
 Thomas Matthews06 янв. 2011 г., 00:20
Я полагаю, что концепцию легче понять как подсчет в базе 26. Первая «цифра» идет от A до Z, рядом с AA, AB, ..., AZ, затем BA и так далее.
void out_perms(std::string word) {
    std::vector<int> indexes(word.size());
    for (size_t i = 0; i < indexes.size(); ++i)
        indexes[i] = i;
    do {
        for (size_t i = 0; i < indexes.size(); ++i)
            std::cout << word[indexes[i]];
        std::cout << std::endl;
    } while (std::next_permutation(indexes.begin(), indexes.end()));
}

int main(int, char**) {
    out_perms("asdfg");
}

http://codepad.org/6lQTPQrG например вывод

 EboMike06 янв. 2011 г., 00:17
Я интерпретировал «каждую возможную перестановку алфавита» как «каждую возможную комбинацию букв в алфавите», то есть от «a» до «aaaaa» через «zzzzz».
Решение Вопроса

что каждая буква появляется ровно один раз, поэтому было бы невозможно сгенерировать любую перестановку, содержащую более 26 букв. В любом случае, поскольку количество сгенерированных строк слишком велико, вы можете вместо этого использовать случайные строки (ниже приведен код C):

char s[30];
int p;
for (;;) // repeat forever: you cannot use a realistic iteration limit anyway
{
    for (p = 0; p < 29; ++p)
        s[p] = 'a' + rand() % 26;
    s[29] = '\0';
    puts(s);
}
 Matthieu N.06 янв. 2011 г., 00:51
это неверно, вы дали определение для комбинации, перестановка - это конструкция, использующая комбинацию, например: комбинация букв a, b и c может создать перестановки abc или aabbcc или abbbbc и т. д. ...
 brian_d06 янв. 2011 г., 00:21
+1 за остроумный сарказм.
 EboMike06 янв. 2011 г., 00:19
Не очень систематично, правда :)
 Lynnell Emmanuel Neri09 дек. 2015 г., 05:51
Действительно, вы даете определение комбинации, а не перестановки. В комбинации abc и acb одинаковы. Но в перестановке abc и acb имеют 2 разных расположения.

просто с моей головы (PHP).

$index = 0;

while(1) {
   $output_string = '';
   $base_26 = (string)base_convert($index, 10, 26);
   if (strlen($base_26) > 29) break;
   for ($i = 0; $i < strlen($base_26); $i++) {
      $output_string .= chr(65 + base_convert($base_26[$i], 26, 10));
   }
   $index++;
   echo $output_string;
}
 dqhendricks06 янв. 2011 г., 00:19
сценарий, скорее всего, в конечном итоге сломается.

public void characterPermutations(int length, LinkedList<String> permutations) {
    if(length > 1) {
        characterPermutations(length - 1, permutations);

        ListIterator<String> iterator = permutations.listIterator();
        while(iterator.hasNext()) {
            String permutation = iterator.next();
            for(char c = 'a'; c <= 'z'; c++) {
                iterator.add(c + permutation);
            }
        }

    } else {
        for(char c = 'a'; c <= 'z'; c++) {
            permutations.add(c + "");
        }
    }
}

Использование приращения символов в стиле Perl.

set_time_limit(0);

$perm = 'A';
$endTest = str_repeat('Z',28).'A';
while ($perm != $endTest) {
    echo $perm++,"\n";
}

Запустите скрипт из командной строки, чтобы не превышать тайм-аут веб-сервера; затем сидеть сложа руки и подождать несколько лет, пока оно не завершится

 logic-unit06 янв. 2011 г., 00:58
Хорошее решение, спасибо. Я включу чайник, пока он работает.

Вот что я бы сделал:

#include <iostream>

void printWords(std::string& word, int index, int last)
{
    std::cout << word << "\n";
    if (index != last)
    {
        for(char loop = 'a'; loop <= 'z'; ++loop)
        {
            word[index] = loop;
            printWords(word, index+1, last);
        }
        word[index] = ' ';
    }
}

int main()
{
    std::string word("                             "); // 29 space

    printWords(word,0,word.length());
}
function p($length, $partial)
{
      if ($length == 0) return $partial;
      $ans = array();
      foreach (range('a', 'z') as $i)
      {
          $ans[] = p($length -1, $partial . $i);
      }
      return $ans;  
}

$top = 3;
//$f = fopen('out.txt');
for ($l = 1; $l < $top+1; $l++)
{
     print_r(p($l), '');
     //fwrite($p($l), '');
}

$top до 29 и попробуйте. Я не собираюсь.

РЕДАКТИРОВАТЬ -print_r(p($l), ''); --->print_r(p($l, ''));

PHP продолжает удивлять меня своей терпимостью к ошибкам. Отсутствует обязательный аргумент для моегоp? нет проблем, это будет просто пустая строка (или ноль, или ложь, в зависимости от ситуации). Второй аргумент в print_r? без разницы, рассматривается как по умолчаниюfalse так или иначе

РЕДАКТИРОВАТЬ

Я не знаю, какого черта я здесь делал. Различные возвращаемые типы p довольно странные и возвращают составной массив со странной структурой.

В любом случае, это гораздо лучшее решение

$lengthDesired = 29;
for($i='a'; $i != str_pad('',$lengthDesired+1,'a'); $i++)
    echo $i .', ';

Ваш ответ на вопрос