Помощь - Поиск - Пользователи - Календарь
Полная версия: частота в разных структурах данных
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
lopata
Снова здравствуйте, товарищи!

у меня задание : написать программу, с помощью которой, а данном тексте, нужно найти слово, которое повторяется чаще всего. Нет различий между большими и маленькими буквами. Это нужно сделать с помощью бинарного дерева поиска, с помощью Хеш таблицы методом цепочек и ,линейным или квадратичным способом.

у меня вопрос относительно алгоритма как примерно это должно функционировать в обоих вариантах?
lopata
у меня вопрос по поводу хеширования строки. Вычитала, Простая и быстрая хеш-функция для строк такая: считаешь сумму кодов символов (с переполнением), каждый раз домножая сумму на 31 или 37 ( в другом источнике прочитала, что лучше на 57 для прописных и строчных букв) В конце берем сумму по модулю равному размеру хеш таблицы.
насколько поняла делать это нужно так :

index := 0;
for i := 1 to Length(s) do
    begin
         k := ord(s[i]);
         index:= index + k;
    end;
index := (k*57) mod 256;



Добавлено через 10 мин.
кажется понимаю, что мне нужно делать. только нужно подумать как быть с прописными и строчными буквами)



а что если индех будет равен длине слова?

Добавлено через 18 мин.
ой..еще дан модуль:


(* WordRdr:                                        HDO, 03-02-27 *)
(* -------                                                       *)
(* Read single words (=seq. of characters) form a text file.     *)
(*===============================================================*)
UNIT WordRdr;

INTERFACE

   TYPE
     Conversion = (noConversion, toLower, toUpper);

   PROCEDURE OpenFile(fileName: STRING; c: Conversion);
   PROCEDURE ReadWord(VAR w: STRING);
   PROCEDURE CloseFile;

IMPLEMENTATION

  USES
    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;
  BEGIN
    FOR i := 1 TO Length(w) DO BEGIN
      CASE 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;
  BEGIN
    FOR i := 1 TO Length(w) DO BEGIN
      CASE w[i] OF
        'a'..'z': w[i] := UpCase(w[i]);
        'ä':      w[i] := 'Ä';
        'ö':      w[i] := 'Ö';
        'ü':      w[i] := 'Ü';
      END; (*CASE*)
    END; (*FOR*)
  END; (*ConvertToUpper*)

  PROCEDURE NextChar;
  BEGIN
    IF cnr < Length(line) THEN BEGIN
        cnr := cnr + 1;
        ch := line[cnr]
      END (*THEN*)
    ELSE BEGIN
      IF NOT Eof(txt) THEN BEGIN
          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);
  BEGIN
    IF open THEN
      CloseFile;
    Assign(txt, fileName);
    (*$I-*)
    Reset(txt);
    (*$I+*)
    IF IOResult <> 0 THEN BEGIN
      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) AND NOT (ch IN characters) DO BEGIN
      NextChar;
    END; (*WHILE*)
    IF ch <> EF THEN
      REPEAT
        w := Concat(w, ch);
        NextChar;
      UNTIL (ch = EF) OR NOT (ch IN characters);
    CASE conv OF
      toUpper: ConvertToUpper(w);
      toLower: ConvertToLower(w);
    END; (*CASE*)
  END; (*ReadWord*)


  (* CloseFile: closes text file                                 *)
  (*-------------------------------------------------------------*)
  PROCEDURE CloseFile;
  BEGIN
    IF open THEN BEGIN
      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) > 0 DO BEGIN
    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) > 0 DO BEGIN
    n := n + 1;
    
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.