Какой эффективный способ написать программу на C (или просто алгоритм), чтобы искать и заменять символы в файле? - PullRequest
0 голосов
/ 20 января 2011

пользователь предоставит 2 строки во время выполнения, такие как «asdf», «qwer», теперь каждое вхождение 'a' должно быть заменено на 'q', 's' на 'w', 'd' на 'e' и 'f' на 'r' длина строки может варьироваться. Теперь дело в том, что файл, с которым нужно работать, огромен, 3-4 терабайта, поэтому нам нужна эффективная программа с эффективностью "n" или "n (log (n))", последовательность if ... else не поможет даны подсказки: 1.> В файле нет специальных символов или пробелов. Он состоит только из символов LOWER CASE 2.> Программа должна использовать тот факт, что в файле всего 26 символов. 3.> наконец, решение каким-то образом сделано с использованием значений символов ascii.

Дополнительные детали Файл должен быть диссертацией на человека, поэтому это не последовательность. и да, мы должны прочитать весь файл последовательно, единственное, что не следует делать, - это сравнение для каждого символа, то есть если (a) затем (q) elseif (s) затем (w) .... что-то ... более эффективный ???

Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 20 января 2011

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

char charsToReplace = "asdf";
char replaceBy = "qwer";
charsToReplaceCount = 4;

char replaceTable[26] = {'a', 'b', 'c', ... , 'z'}

for (int i=0; i<charsToReplaceCount; ++i)
{
    replaceTable[charsToReplace[i] - 'a'] = replaceBy[i];
}

...

for (int i=0; i<fileLengthChunk; ++i)
{
    file[i] = replaceTable[file[i] - 'a'];
}

Я пропустил чтение и запись файла, а также фрагменты, так как файл огромен.

0 голосов
/ 20 января 2011

Вы начнете с поиска первого символа в строке «для замены», как только вы найдете экземпляр, вы начинаете работать с вашей строкой «для замены», проверяя каждый последующий символ, если полное совпадение найдено Вы делаете замену.

Если строки не всегда имеют одинаковую длину, вам нужно прочитать файл и записать измененный файл? Я бы предположил, что это будет сделано по частям, если вы не можете разместить 4 ТБ в памяти.

Основной псевдокод будет:

objectstr = "asdf";
targetstr = "qwer";
while not eof
{
   filechar = readchar;
   if (filechar == objectstr[0])
   {
      if (remainingfilechars > length(objectstr)-1)
      {
          match = true;
          for i = 1 to length(objectstr)-1
          {
              filechar = readchar
              if (filechar != objectstr[i])
              {
                  match = false;
                  break;
              }
          }
          if (match)
          {
              writefile(targetstr);
          }
          else
          {
              fileseek(currentfileposition - (length(objectstr)-1));
              writefile(filechar);
          }
       }
    }
    else
    {
        writefile(filechar);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...