IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Поиск одинаковых строк в двух файлах
*оля*
сообщение 27.04.2010 13:39
Сообщение #21


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(Lapp @ 27.04.2010 13:10) *

а алгоритм volvo? Что в нем неясного?

Для некоторого упрощения: можно просто читать каждую строку из первого файла искать ее во втором.


Скажем, MD5 (с использованием System.Security.Cryptography он вычисляется в 3 строки).
вот это не понятно мне
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.04.2010 13:56
Сообщение #22


Гость






Ну смотри. Существует такой алгоритм хеширования - Wiki- > MD5

Так вот, подобный хеш можно получить из любой строки, используя доступные из PascalABC.NET ДотНет-овские классы, а не писать функции для его вычисления самостоятельно:
uses 
System.Collections.Generic, System.Security.Cryptography;

var
prov:System.Security.Cryptography.MD5CryptoServiceProvider;
// это надо будет еще проинициализировать в основной программе

function CalcHash(s: string):string;
var
a: array of byte;
sb: System.Text.StringBuilder;
begin
a := System.Text.Encoding.UTF8.GetBytes(s);
a := prov.ComputeHash(a);
sb := new System.Text.StringBuilder;
foreach b: byte in a do sb.Append(b.ToString('x2').ToLower());

CalcHash:= sb.ToString;
end;
В результате функция вернет хеш переданной в нее строки, который будет уникальным. Совпадение хешей будет означать совпадение строк, для которых они вычислялись.

Но это - уже реализация. Что в алгоритме-то непонятно? smile.gif
 К началу страницы 
+ Ответить 
*оля*
сообщение 27.04.2010 16:45
Сообщение #23


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 27.04.2010 13:56) *

Ну смотри. Существует такой алгоритм хеширования - Wiki- > MD5
...
Но это - уже реализация. Что в алгоритме-то непонятно? smile.gif


smile.gif теперь все понятно, спасибо! во всяком случае пока, сейчас попробую написать полностью программу, тогда думаю возникнут еще вопросы по мере написания)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 27.04.2010 21:16
Сообщение #24


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


выдает такую ошибку: Ошибка времени выполнения: В экземпляре объекта не задана ссылка на объект.
в строке
a := prov.ComputeHash(a);
я наверное что-то не дописала...что бы это могло быть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.04.2010 21:21
Сообщение #25


Гость






А я предупреждал:
Цитата
// это надо будет еще проинициализировать в основной программе


В самом начале основной программы надо инициализировать этот объект:
prov := new System.Security.Cryptography.MD5CryptoServiceProvider;

, только после этого его можно использовать. Обрати внимание, точно так же перед использованием внутри функции инициализируется System.Text.StringBuilder. Любой обзект перед тем, как к нему обращаться, нужно создать...
 К началу страницы 
+ Ответить 
*оля*
сообщение 27.04.2010 21:33
Сообщение #26


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


точно, написано же было, забыла. спасибо, теперь все нормально пока)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 28.04.2010 12:13
Сообщение #27


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


2 volvo:
я все же не понимаю, в чем тут пойнт применения хэшей. Почему нельзя сравнивать сами строки? В задаче нет ничего про секьюрити или там сжатие.. Сравнение строк может быть эффективнее использования хэшей в конечном итоге. Большинство строк начинаются с неравных символов - они сразу отметаются в самом начале. А для вычисления хэша всегда нужно прочитать всю строку. Зачем? blink.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.04.2010 12:24
Сообщение #28


Гость






Только ради экономии памяти. Прочитать все строки файла в память (а строка может быть длинной), или хранить только хеш (фиксированной, причем небольшой) длины - это две большие разницы. И разницы эти тем больше, чем больше размеры файлов, с которыми нужно работать и чем длиннее в них строки.

В принципе, можно обойтись и без хеширования, конечно; надо будет прогнать пару тестов на больших файлах, посмотреть, насколько быстро MD5 вообще вычисляется, и насколько программа начинает подтормаживать, когда ей проходится работать со строками, а не их хешами... Если торможения не будет (или будет незначительное) - то работать с полными строками.
 К началу страницы 
+ Ответить 
Lapp
сообщение 28.04.2010 12:32
Сообщение #29


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 28.04.2010 13:24) *
Только ради экономии памяти.
да, про память я как-то уже забыл тут.. smile.gif Прикинул, что 1500 строк (по максимум 255 символов) берут не больше трети мега - и забыл..

Да, конечно, если нужно сжимать - то хэш. Но, судя по началу темы ("лишь бы работало")) - скорее всего не нужно.. Сравнить скорость двух подходов: с хэшированием и непосредственным чтением из файла - это действительно интересно. Результат, впрочем, будет сильно зависеть от системного дискового кэша..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 28.04.2010 17:14
Сообщение #30


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


идея сравнить 2 метода очень интересная good.gif )))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 28.04.2010 18:30
Сообщение #31


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 27.04.2010 11:32) *

Берешь файл. Один... Построчно читаешь его в переменную типа String, и запоминаешь в List<String> ее хеш.



можно спросить, каким образом сохранить в List<String>? (
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.04.2010 18:41
Сообщение #32


Гость






У него есть метод Add:
var
L: System.Collections.Generic.List<string>;

...
// Инициализируем список:
L := new System.Collections.Generic.List<string>;

// Каким-то образом получаем строку, которую надо сохранить (назовем ее st)

L.Add(st); // и заносим строку в список

За дополнительной информацией о .NET-овских контейнерах - сюда: MSDN -> System.Collections.Generic Namespace
 К началу страницы 
+ Ответить 
*оля*
сообщение 28.04.2010 19:51
Сообщение #33


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 28.04.2010 18:41) *

У него есть метод Add:
var
L: System.Collections.Generic.List<string>;

...
// Инициализируем список:
L := new System.Collections.Generic.List<string>;

// Каким-то образом получаем строку, которую надо сохранить (назовем ее st)

L.Add(st); // и заносим строку в список



а потом,для поиска тоже свой метод есть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.04.2010 21:47
Сообщение #34


Гость






Естественно. Есть метод Find, есть FindAll (для поиска всех совпадений по заданному критерию), есть метод Contains, позволяющий определить просто есть ли в списке заданный элемент, есть IndexOf (чтобы определить индекс элемента, совпадающего с искомой строкой)... Методов - валом...

Мне кажется, или тема уже вышла далеко за рамки раздела "Задачи"? Теперь здесь в основном обсуждаются .NET-овские фишки. Может перенести в "Другие языки"? (я понимаю, что язык тот же, но... Туда и шарписты заходят, может помогут чем).
 К началу страницы 
+ Ответить 
*оля*
сообщение 29.04.2010 22:24
Сообщение #35


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 28.04.2010 21:47) *

Естественно. Есть метод Find, есть FindAll (для поиска всех совпадений по заданному критерию), есть метод Contains, позволяющий определить просто есть ли в списке заданный элемент, есть IndexOf (чтобы определить индекс элемента, совпадающего с искомой строкой)... Методов - валом...

Мне кажется, или тема уже вышла далеко за рамки раздела "Задачи"? Теперь здесь в основном обсуждаются .NET-овские фишки. Может перенести в "Другие языки"? (я понимаю, что язык тот же, но... Туда и шарписты заходят, может помогут чем).


спасибо, все, с .NET-овскими фишками вопросов больше нет)
теперь другое... мы считаем хеш сразу для всей строки, а как посчитатеь его не сразу для всей, а для каждого слова в строке отдельно?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 30.04.2010 18:39
Сообщение #36


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


что не так в программе?
 var
rand8: array[0..255] of integer;
st: string;
line: string;
F: text;
f_name: string;

procedure init;
var
i: integer;
begin
randomize;
for i:=0 to 255 do
rand8[i]:=random(255);
end;

function h(st: string): integer;
Var
Sum: longint;
I: integer;
Begin
For i:=0 to length(st) do
Sum := sum + ord(st[i]) xor rand8[i];
H:=sum mod 256;
end;

begin
writeln('введите имя файла');
readln(f_name);
assign(f,f_name);
reset(f);
while not eof(f) do begin
readln(line);
st:=line;
init;
h(st);
writeln (h(st));
end;
close(f);
end.
.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 30.04.2010 19:28
Сообщение #37


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


все, нашла ошибку, сорри
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 13:27
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"