Здравствуйте, ionicman, Вы писали:
I>Надо заменить все вхождения строки в файле на другую. I>Без всяких STL и др.
Перл не предлагать?
I>Максимальный размер буфера под данные может быть 64 кб, размер поисковой и заменяемой строк — любые, размер файла любой.
Искомая строка заведомо влезает в буфер?
Если да, то подумай об алгоритме Бойера-Мура.
Если нет — то Кнута-Морриса-Пратта. (К которому, как мне кажется, сведётся любой наивный алгоритм — только с ужасами и провалом производительности).
I>Я накидал в принципе уже — но уж больно как то не красиво получается, хотя работает :D Мож есть у кого варианты?
К>Перл не предлагать?
ага :D
I>>Максимальный размер буфера под данные может быть 64 кб, размер поисковой и заменяемой строк — любые, размер файла любой.
К>Искомая строка заведомо влезает в буфер?
нет, к сожелению К>Если нет — то Кнута-Морриса-Пратта. (К которому, как мне кажется, сведётся любой наивный алгоритм — только с ужасами и провалом производительности).
Если я правильно помню — этот алгоритм основан на создании таблицы — словаря слов?
проблема в том, что файл может быть двоичным, в котором есть строки, но разбить его на словарь не получится.
Единственное, что точно — это то что поисковая строка и строка — заместитель — обычные строки
I>>Я накидал в принципе уже — но уж больно как то не красиво получается, хотя работает :D Мож есть у кого варианты?
Здоровый он, да и медленный просто хана — я по этому и написал сюда. Работает по очень простому алгоритму — вдоль файла двигается окно и проверяется все до первого частичного совпадения с образцом. Если образец лишь частично совпал — эта часть переносится в начало окна и догружается следующая. Если следующая часть совпала — то приходится выходной файл отматывать на длину уже записаного куска ( он нам не нужен — мы должны его заменить ) и обрезать его.
Здравствуйте, ionicman, Вы писали:
К>>Искомая строка заведомо влезает в буфер? I>нет, к сожелению
Но хотя бы в памяти её саму можно держать?
Или приходится тоже из другого файла по кусочкам подкачивать?
К>>Если нет — то Кнута-Морриса-Пратта. (К которому, как мне кажется, сведётся любой наивный алгоритм — только с ужасами и провалом производительности). I>Если я правильно помню — этот алгоритм основан на создании таблицы — словаря слов?
ЗК>Но хотя бы в памяти её саму можно держать? К>Или приходится тоже из другого файла по кусочкам подкачивать?
нет, она целиком в памяти, как и строка замещения
К>Нет, он основан на таблице букв.
понял.
К>Может, тебе поспособствует вот эта ссылка: http://algolist.manual.ru/search/esearch/
оо. спс польшое за информацию. похоже то что надо.
Здравствуйте, ionicman, Вы писали:
I>Здоровый он, да и медленный просто хана — я по этому и написал сюда. Работает по очень простому алгоритму — вдоль файла двигается окно и проверяется все до первого частичного совпадения с образцом. Если образец лишь частично совпал — эта часть переносится в начало окна и догружается следующая. Если следующая часть совпала — то приходится выходной файл отматывать на длину уже записаного куска ( он нам не нужен — мы должны его заменить ) и обрезать его.
А почему бы, пока есть частичное совпадение, ничего не писать в файл? Если при добавлении очередного символа оказалось, что фрагмент не совпадает с искомым словом, скидываем посимвольно начало буфера вплоть до символа, начиная с которого искомое слово и имеющаяся часть буфера совпадают. Звучит чуть замысловато, но идея простая.
Здравствуйте, Alexander, Вы писали:
A>Здравствуйте, ionicman, Вы писали:
I>>Здоровый он, да и медленный просто хана — я по этому и написал сюда. Работает по очень простому алгоритму — вдоль файла двигается окно и проверяется все до первого частичного совпадения с образцом. Если образец лишь частично совпал — эта часть переносится в начало окна и догружается следующая. Если следующая часть совпала — то приходится выходной файл отматывать на длину уже записаного куска ( он нам не нужен — мы должны его заменить ) и обрезать его. A>А почему бы, пока есть частичное совпадение, ничего не писать в файл? Если при добавлении очередного символа оказалось, что фрагмент не совпадает с искомым словом, скидываем посимвольно начало буфера вплоть до символа, начиная с которого искомое слово и имеющаяся часть буфера совпадают. Звучит чуть замысловато, но идея простая.
Может получится так, что строка для сравнения больше возможного размера буффера — мне просто некуда будет сохранять данные
Здравствуйте, ionicman, Вы писали:
I>Может получится так, что строка для сравнения больше возможного размера буффера — мне просто некуда будет сохранять данные
А зачем их сохранять, если они в точности равны уже рассмотренному началу образца?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, ionicman, Вы писали:
I>>Может получится так, что строка для сравнения больше возможного размера буффера — мне просто некуда будет сохранять данные E> А зачем их сохранять, если они в точности равны уже рассмотренному началу образца?
О! А это мысл! Вот блин а.... смещение же можно только.... Класс, спасибо!
Здравствуйте, ionicman, Вы писали:
I>О! А это мысл! Вот блин а.... смещение же можно только.... Класс, спасибо!
Пожалуйста. Мне не жалко намекнуть...
А лучше Alexander'у двоечку поставь
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском