у меня задание : написать программу, с помощью которой, а данном тексте, нужно найти слово, которое повторяется чаще всего. Нет различий между большими и маленькими буквами. Это нужно сделать с помощью бинарного дерева поиска, с помощью Хеш таблицы методом цепочек и ,линейным или квадратичным способом.
у меня вопрос относительно алгоритма как примерно это должно функционировать в обоих вариантах?
lopata
16.03.2010 2:45
у меня вопрос по поводу хеширования строки. Вычитала, Простая и быстрая хеш-функция для строк такая: считаешь сумму кодов символов (с переполнением), каждый раз домножая сумму на 31 или 37 ( в другом источнике прочитала, что лучше на 57 для прописных и строчных букв) В конце берем сумму по модулю равному размеру хеш таблицы. насколько поняла делать это нужно так :
index := 0;
for i := 1to Length(s) dobegin
k := ord(s[i]);
index:= index + k;
end;
index := (k*57) mod256;
Добавлено через 10 мин. кажется понимаю, что мне нужно делать. только нужно подумать как быть с прописными и строчными буквами)
а что если индех будет равен длине слова?
Добавлено через 18 мин. ой..еще дан модуль:
(* WordRdr: HDO, 03-02-27 *)(* ------- *)(* Read single words (=seq. of characters) form a text file. *)(*===============================================================*)UNIT WordRdr;
INTERFACETYPE
Conversion = (noConversion, toLower, toUpper);
PROCEDURE OpenFile(fileName: STRING; c: Conversion);
PROCEDURE ReadWord(VAR w: STRING);
PROCEDURE CloseFile;
IMPLEMENTATIONUSES
WinCrt;
CONST
characters = ['a' .. 'z', 'ä', 'ö', 'ü', 'ß',
'A' .. 'Z', 'Ä', 'Ö', 'Ü'];
EF = CHR(0); (*end of file character*)VAR
txt: TEXT; (*text file*)
open: BOOLEAN; (*file opened?*)
line: STRING; (*current line*)
ch: CHAR; (*current character*)
cnr: INTEGER; (*column number of current character*)
conv: Conversion; (*kind of conversion*)PROCEDURE ConvertToLower(VAR w: STRING);
VAR
i: INTEGER;
BEGINFOR i := 1TO Length(w) DOBEGINCASE w[i] OF'A'..'Z': w[i] :=CHR(ORD(w[i]) + 32) ;
'Ä': w[i] := 'ä';
'Ö': w[i] := 'ö';
'Ü': w[i] := 'ü';
END; (*CASE*)END; (*FOR*)END; (*ConvertToLower*)PROCEDURE ConvertToUpper(VAR w: STRING);
VAR
i: INTEGER;
BEGINFOR i := 1TO Length(w) DOBEGINCASE w[i] OF'a'..'z': w[i] := UpCase(w[i]);
'ä': w[i] := 'Ä';
'ö': w[i] := 'Ö';
'ü': w[i] := 'Ü';
END; (*CASE*)END; (*FOR*)END; (*ConvertToUpper*)PROCEDURE NextChar;
BEGINIF cnr < Length(line) THENBEGIN
cnr := cnr + 1;
ch := line[cnr]
END(*THEN*)ELSEBEGINIFNOT Eof(txt) THENBEGIN
ReadLn(txt, line);
cnr := 0;
ch := ' '; (*separate lines by ' '*)END(*THEN*)ELSE
ch := EF;
END; (*ELSE*)END; (*NextChar*)(* OpenFile: opens text file named fileName *)(*-------------------------------------------------------------*)PROCEDURE OpenFile(fileName: STRING; c: Conversion);
BEGINIF open THEN
CloseFile;
Assign(txt, fileName);
(*$I-*)
Reset(txt);
(*$I+*)IF IOResult <> 0THENBEGIN
WriteLn('ERROR in WordRdr.OpenFile: file ', fileName, ' not found');
HALT;
END; (*IF*)
open := TRUE;
conv := c;
line := '';
cnr := 1; (*1 >= Length('') => force reading of first line*)
NextChar;
END; (*OpenFile*)(* NextWord: reads next word from file, returns '' on endfile *)(*-------------------------------------------------------------*)PROCEDURE ReadWord(VAR w: STRING);
BEGIN
w := '';
WHILE (ch <> EF) ANDNOT (ch IN characters) DOBEGIN
NextChar;
END; (*WHILE*)IF ch <> EF THENREPEAT
w := Concat(w, ch);
NextChar;
UNTIL (ch = EF) ORNOT (ch IN characters);
CASE conv OF
toUpper: ConvertToUpper(w);
toLower: ConvertToLower(w);
END; (*CASE*)END; (*ReadWord*)(* CloseFile: closes text file *)(*-------------------------------------------------------------*)PROCEDURE CloseFile;
BEGINIF open THENBEGIN
Close(txt);
open := FALSE;
END; (*IF*)END; (*CloseFile*)BEGIN(*WordRdr*)
open := FALSE;
END. (*WordRdr*)
Добавлено через 7 мин. + пример реализации программы
* WordCnt: HDO, 2003-02-28 *)
(* ------- *)(* Template for programs to count words in text files. *)(* ATTENTION: Set compiler options to NO strict var-strings. *)(*===============================================================*)PROGRAM WordCnt;
USES
WinCrt, WordRdr;
CONST
maxWordLen = 20;
TYPE
Word = STRING[maxWordLen]; (*to save memory*)VAR
w: Word;
n: LONGINT;
BEGIN(*WordCnt*)
OpenFile('Kafka.txt', toLower);
n := 0;
ReadWord(w);
WHILE Length(w) > 0DOBEGIN
n := n + 1;
(*insert word in data structure and count its occurence*)
ReadWord(w);
END; (*WHILE*)
CloseFile;
WriteLn('total number of words = ', n);
(*search in data structure for word with max. occurrence*)END. (*WordCnt*)
Добавлено через 3 мин. Только вот не понимаю что это в главное программе :
WHILE Length(w) > 0DOBEGIN
n := n + 1;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.