Моя первая попытка создать список слов,

Я пытаюсь создать список слов, который содержит все комбинации букв (прописные и строчные) и некоторые символы. В основном большая часть таблицы ASCII.

Меня просто интересовало, сколько памяти займет текстовый файл. Я думаю, что я буду использовать некоторые другие функции, чтобы удалить ненужные слова. Но сейчас я молюсь, чтобы мой жесткий диск объемом 1 ТБ не взорвался. Я не знаю, является ли этот метод правильным методом, использующим вложенные циклы for с подписанным массивом, возможно, я должен использовать связанный список для лучшей производительности. Тем временем я могу создавать функции, которые удаляют строки с большим количеством символов, чем некоторые.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PATH "wordlist.txt"
#define SIZE 68



void Write(char * word[], FILE * f, int N)
{
for(int i = 0; i <= N; i++)
  {
  fprintf(f,"%s", word[i]);
  }
  fprintf(f,"\n");
}




void thirteen_Digits(char * word[],char * letters[] , FILE * f)
{
  for(int i = 0; i < SIZE; i++)
  {
    word[0] = letters[i];
    for(int j = 0; j < SIZE ;j++)
      {
        word[1] = letters[j];
        for(int k = 0; k < SIZE; k++)
        {
          word[2] = letters[k];
          for(int l = 0; l < SIZE;l++)
          {
            word[3] = letters[l];
            for(int m = 0; m< SIZE; m++)
            {
              word[4] = letters[m];
              for(int n = 0; n < SIZE; n++)
              {
                word[5] = letters[n];
                for(int o = 0; o < SIZE; o++)
                {
                  word[6] = letters[o];
                  for(int p = 0; p < SIZE; p++)
                  {
                    word[7] = letters[p];
                    for(int q = 0; q < SIZE; q++)
                    {
                      word[8] = letters[q];
                      for(int r = 0; r < SIZE; r++)
                      {
                        word[9] = letters[r];
                        for(int s = 0; s < SIZE;s++)
                        {
                          word[10] = letters[s];
                          for(int t = 0; t < SIZE; t++)
                          {
                            word[11] = letters[t];
                            for(int u = 0; u < SIZE; u++)
                            {
                              word[12] = letters[u];
                              Write(word, f, 12);
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

fclose(f);
}

void twelve_Digits(char * word[],char * letters[] , FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          for(int m = 0; m< SIZE; m++)
          {
            word[4] = letters[m];
            for(int n = 0; n < SIZE; n++)
            {
              word[5] = letters[n];
              for(int o = 0; o < SIZE; o++)
              {
                word[6] = letters[o];
                for(int p = 0; p < SIZE; p++)
                {
                  word[7] = letters[p];
                  for(int q = 0; q < SIZE; q++)
                  {
                    word[8] = letters[q];
                    for(int r = 0; r < SIZE; r++)
                    {
                      word[9] = letters[r];
                      for(int s = 0; s < SIZE;s++)
                      {
                        word[10] = letters[s];
                        for(int t = 0; t < SIZE; t++)
                        {
                          word[11] = letters[t];
                          Write(word, f,11);
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

void eleven_Digits(char * word[],char * letters[] , FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          for(int m = 0; m< SIZE; m++)
          {
            word[4] = letters[m];
            for(int n = 0; n < SIZE; n++)
            {
              word[5] = letters[n];
              for(int o = 0; o < SIZE; o++)
              {
                word[6] = letters[o];
                for(int p = 0; p < SIZE; p++)
                {
                  word[7] = letters[p];
                  for(int q = 0; q < SIZE; q++)
                  {
                    word[8] = letters[q];
                    for(int r = 0; r < SIZE; r++)
                    {
                      word[9] = letters[r];
                      for(int s = 0; s < SIZE;s++)
                      {
                        word[10] = letters[s];
                        Write(word, f,10);
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

void ten_Digits(char * word[],char * letters[] , FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          for(int m = 0; m< SIZE; m++)
          {
            word[4] = letters[m];
            for(int n = 0; n < SIZE; n++)
            {
              word[5] = letters[n];
              for(int o = 0; o < SIZE; o++)
              {
                word[6] = letters[o];
                for(int p = 0; p < SIZE; p++)
                {
                  word[7] = letters[p];
                  for(int q = 0; q < SIZE; q++)
                  {
                    word[8] = letters[q];
                    for(int r = 0; r < SIZE; r++)
                    {
                      word[9] = letters[r];
                      Write(word, f,9);
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

void nine_Digits(char * word[], char * letters[] ,FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          for(int m = 0; m< SIZE; m++)
          {
            word[4] = letters[m];
            for(int n = 0; n < SIZE; n++)
            {
              word[5] = letters[n];
              for(int o = 0; o < SIZE; o++)
              {
                word[6] = letters[o];
                for(int p = 0; p < SIZE; p++)
                {
                  word[7] = letters[p];
                  for(int q = 0; q < SIZE; q++)
                  {
                    word[8] = letters[q];
                    Write(word, f,  8);
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

void eight_Digits(char * word[],char * letters[] , FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          for(int m = 0; m< SIZE; m++)
          {
            word[4] = letters[m];
            for(int n = 0; n < SIZE; n++)
            {
              word[5] = letters[n];
              for(int o = 0; o < SIZE; o++)
              {
                word[6] = letters[o];
                for(int p = 0; p < SIZE; p++)
                {
                  word[7] = letters[p];
                  Write(word, f, 7);
                }
              }
            }
          }
        }
      }
    }
  }
}

void seven_Digits(char * word[], char * letters[] ,FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          for(int m = 0; m< SIZE; m++)
          {
            word[4] = letters[m];
            for(int n = 0; n < SIZE; n++)
            {
              word[5] = letters[n];
              for(int o = 0; o < SIZE; o++)
              {
                word[6] = letters[o];
                  Write(word, f, 6);
              }
            }
          }
        }
      }
    }
  }
}

void six_Digits(char * word[],char * letters[] , FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          for(int m = 0; m< SIZE; m++)
          {
            word[4] = letters[m];
            for(int n = 0; n < SIZE; n++)
            {
              word[5] = letters[n];
              Write(word, f, 5);
            }
          }
        }
      }
    }
  }
}
void five_Digits(char * word[],char * letters[] , FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          for(int m = 0; m< SIZE; m++)
          {
            word[4] = letters[m];
            Write(word, f, 4);
          }
        }
      }
    }
  }
}

void four_Digits(char * word[], char * letters[] ,FILE * f)
{
for(int i = 0; i < SIZE; i++)
{
  word[0] = letters[i];
  for(int j = 0; j < SIZE ;j++)
    {
      word[1] = letters[j];
      for(int k = 0; k < SIZE; k++)
      {
        word[2] = letters[k];
        for(int l = 0; l < SIZE;l++)
        {
          word[3] = letters[l];
          Write(word, f, 3);
        }
      }
    }
  }
}


int main()
{
  FILE *f;

  if(!(f=fopen(PATH, "a")))
  {
    perror("Errore");
    exit(-1);
  }


  char * letters[SIZE] = {"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",
                          "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",
                          ".","_","1","2","3","4","5","6","7","8","9","0","!","@","$","§"};

  char * word13[] = {"A","A","A","A","A","A","A","A","A","A","A","A","A"};
  char * word12[] = {"A","A","A","A","A","A","A","A","A","A","A","A"};
  char * word11[] = {"A","A","A","A","A","A","A","A","A","A","A"};
  char * word10[] = {"A","A","A","A","A","A","A","A","A","A"};
  char * word9[] = {"A","A","A","A","A","A","A","A","A"};
  char * word8[] = {"A","A","A","A","A","A","A","A"};
  char * word7[] = {"A","A","A","A","A","A","A"};
  char * word6[] = {"A","A","A","A","A","A"};
  char * word5[] = {"A","A","A","A","A"};
  char * word4[] = {"A","A","A","A"};

 four_Digits(word4,letters, f);
 five_Digits(word5,letters, f);
 six_Digits(word6,letters, f);
 seven_Digits(word7,letters, f);
 eight_Digits(word8,letters, f);
 nine_Digits(word9,letters, f);
 ten_Digits(word10, letters,f);
 eleven_Digits(word11,letters, f);
 twelve_Digits(word12, letters,f);
 thirteen_Digits(word13,letters, f);

exit(EXIT_SUCCESS);
}

Я буду признателен за любую помощь для ускорения алгоритма.

1 ответ

Эта программа не закончится за всю вашу жизнь - и она заполнит ваш жесткий диск задолго до этого.

Существует 6813 = 6 × 1023 возможных комбинаций из тринадцати символов, выбранных из набора из 68 символов. Для каждого из 14 байтов (13 символов + одна новая строка) их хранение в файле займет примерно 9,3 × 1024 байта или 9,3 триллиона терабайт. Это на несколько порядков больше, чем объем хранимых данных на планете.

Вам нужно пересмотреть то, что вы пытаетесь сделать здесь. Это явно не сработает.


С точки зрения реализации, однако, есть более простой способ приблизиться к этому, чем использование вложенных циклов:

void permute(int length, int maximum_digit)
{
    int *digits = calloc(length, sizeof(int));
    do {
        print_digits(digits, length);
    } while (increment(digits, length, maximum_digit));
    free(digits);
}

Эта функция создает массив с переменным количеством цифр (устанавливается length) и "увеличивает" этот массив на каждом шаге, пока он не достигнет максимального значения (maximum_digit).

Мы можем реализовать это увеличение, пройдя через массив; для каждой цифры мы увеличиваем ее и останавливаем, если она меньше максимального значения, или обнуляем ее и продолжаем в противном случае:

int increment(int *digits, int length, int maximum_digit)
{
    for (int i = 0; i < length; i++) {
        if (digits[i] + 1 == maximum_digit) {
            digits[i] = 0;
        } else {
            digits[i]++;
            return 1;
        }
    }
    return 0;
}

Реализация print_digits() оставлено для читателя.

Другие вопросы по тегам