Отправляет email-рассылки с помощью сервиса Sendsay

Бизнес с высокой прибылью

  Все выпуски  

Черный ящик. Эпизод первый: от компьютера - к бизнесу Вторая серия. Выпуск от 10.10.2002


Информационный Канал Subscribe.Ru

Программирование: структура данных


Как хранить данные о частоте слов в программе.

Рассмотрим несколько вариантов. Какие у нас данные:
Во-первых, это слово, которое встретилось в тексте - понятно, что хранить его будем в строке (string) Слово короткое, значит подходит даже короткая строка до 256 символов - ShortString.
Если работать только с теми языками, символы которых входят в какую-то 256- символьную кодовую таблицу ansi, то достаточно взять один байт на символ и использовать тип AnsiString. Если же делать поддержку других языков по новой моде, то нужно исполь зовать Unicode, где каждый символ записывается двумя байтами, значит хранить слово надо в WideString.
Проще всего оставить просто тип string.
Если включить директиву {$H-}, то String интерпретируется компилятором как тип ShortString - короткая строка без нулевого символа в конце.
Если же включена директива {$H+} (она включена по умолчанию), то String интерпретируется компилятором как тип AnsiString - длинная строка с нулевым символом в конце.
А с WideString буду разбираться потом - когда дело дойдет то каких-то экзотических языков.

Во-вторых, нужно хранить сведения о частотах слов в тексте. Сначала нужно выбрать, с какими величинами лучше работать - с частотами или с количеством. Частота - это вещественное число, которое всегда больше либо равно нулю и меньше либ о равно единице.
Проще всего указать его тип как Real. Если подумать об экономии памяти, то наверно стоило бы выбрать Single, хотя в нашем случае это не важно (в любом естественном языке не более одного-двух миллионов различных слов, а в каком-то тексте вряд ли будет больше нескольких десятков тысяч. Поэтому нет никакого смысла экономить сто килобайт ОЗУ :)
Когда мы будем объединять статистику по нескольким текстам, то придется что-то делать с частотами. Нельзя просто считать среднее - длины текстов могли быть разными.
Поэтому проще работать с количеством - сколько раз это слово встретилось в тексте. А чтобы получить частоту - просто разделить количество на общее количество слов в тексте.
Количество - это целое число. Можем использовать тип Integer или, учитывая, что число может быть только положительное - Cardinal. Использовать тип Word нельзя, т.к. наши числа могут быть больше 65535.

Таким образом получили такой тип для хранения данных об одном слове:

type
 TmyRec = record
  Slovo : string;   // слово
  N     : Cardinal; // количество
 end;

Таких слов будет много и проще всего объединить эти записи в массив:

var
  VStat: array of TmyRec;

Перечислим основные операции, которые нужно будет выполнять с нашими данными:

  • добавление нового слова (новой записи)
  • добавление существующего слова (увеличение его количества на 1)
  • сортировка по алфавиту
  • сортировка по количеству
  • выборка записей из списка по определенному условию
  • удаление из списка некоторых слов по определенному условию
  • объединение нескольких сходных слов в одну запись

Дальше основная задача - разобраться с хранением и обработкой данных - как хранить данные.
Перечислю несколько наиболее естественных вариантов.

1. Массив записей.
Это самый очевидный способ.
Первый недостаток - нам заранее неизвестно количество терминов. То есть нужно заказывать массив такого размера, чтобы его точно хватило, но и не слишком большой, чтобы не занимать лишнюю память.
С другой стороны, можно делать отдельно "пробную" или демо-версию программы с небольшой длиной массива - порядка 100-500 слов, а в полной версии (которая покупается) поставить большое число - скажем сто тысяч.

{$DEFINE DEMO} // эта строка - для демо-версии

type
{$IFDEF DEMO}  TStat = array [1..100] of TmyRec;
{$ELSE}        TStat = array [1..100000] of TmyRec;
{$ENDIF}

var
  VStat: TStat;

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

2. Динамический массив записей.
Так можно выделять памяти не больше чем надо, но придется следить за размером массива. Для демо-версии также не составит особого труда ограничить выделение памяти для максимального количества записей.

var
  VStat: array of TmyRec;
 ..                     ...
begin
 SetLength(VStat, 100);

3. Оставить все так, как было сделано раньше.
Задан класс - потомок TStringList, в котором хранятся все слова (string), а соответствующее количество N : Cardinal; привязываем к нужной строке с помощью property Objects[Index: Integer]: TObject;
Для этом в классе - потомке TStringList переопределены методы добавления и удаления строки, а еще добавлен метод для сортировки по количеству.

4. Использовать базу данных.
Данные можно хранить как таблицу БД. Так мы очень просто получим готовое решение для сортировки и поиска нужной записи.
Основной недостаток - придется брать с собой борландовский интерфейс БД: IDAPI(BDE). А это добавит пару мегабайт к дистрибутиву, что неприемлемо.

Как я понял, в 6й дельфи есть возможность обойтись без BDE. Из писем по одному из прошлых выпусков: Peter рекомендует:
>Что бы не было проблем с драйверами можно использовать XML (в Delphi 6 - ClientDataSet)

Здесь возникла немного другая проблема. Теперь мне кажется, что пока лучше остаться на 4-й дельфи. Связано это с вопросом о лицензионности.
Это очень интересный и самый популярный вопрос. ;)
Все знают (или догадываются :) сколько стоит лицензионная копия Дельфей, но тем не менее многие почему-то спрашивают. ;)
Да, у меня, конечно, уже есть грандиозные планы по закупке лицензионного ПО.
На какие шиши? Жванецкий, правда по другому поводу, от лица кого-то из своих героев говорил примерно так: "не надо воровать с убытков, воруйте с прибылей!". Только у нас будет "не воровать". В смысле покупать ПО с честно заработанных на продаже ПО де нег. :)
Причем тут версия Дельфи? Дело в том, что старое ПО иногда можно перекупить за сравнительно небольшую цену. Например на интернет-аукционе e-buy. А насобирать деньжат на самую последнюю версию будет намного сложнее.

А какие будут проблемы по лицензионности - ответ простой: вас замучают страшные угрызения совести! Поэтому ПО нужно покупать. (Как только будут заработаны на эту покупку деньги - так сразу и покупать.)
Ну действительно, не будет же к вам домой врываться отряд ОМОНовцев с резиновыми палками, щитами и автоматами, чтобы проверить наличие лицензии на все ПО, что стоит на компьютере :) И корпорации MS и Борланд тоже ночами не спят, лишь бы притащить вас в суд и посадить на пару лет.
Так что я для себя вопрос решил - начинать собирать денежки на компиляторы.

Да, как мне объяснили, Дельфи записывает в exe-шник не номер нашей лицензии :) а только номер версии и тип (trial, Professional, Enterprise). Т.е. на пробной версии компилировать результат не стоит - там в лицензии не разрешается прода жа.

К слову, есть у меня одно подозрение - почему так часто встает этот вопрос - о лицензионности, но об этом мы поговорим уж совсем в другой раз...

5. Может есть какой бесплатный компонент? Такой в котором уже реализован динамический массив записей с поиском и возможностью сортировки по любому полю этой записи. Кто знает - напишите.
Или может какой компонент доступа к dbf-файлам с возможностью выполнять простейшие SQL-запросы - для поиска и сортировки.
А может проще взять этот ТClientDataSet и не забивать себе мозги?
Хотя еще проще, конечно оставить все как есть, правда там сортировка по количеству у меня сделана криво и ее надо будет пере/до- делать


Ведущий проекта - Алексей.

Есть что сказать? пишите сюда: blackbox@mailru.com
Все, что вы напишете, может быть использовано для вас в рассылке (в том числе ваша подпись под письмом).
Если вы против публикации своего письма, укажите тему письма "секретно" или "не публиковать".

По вопросам идеология проекта - смотри идеи Школы своего Дела (ШСД).
Рекомендую: лучшие рассылки по бизнесу и развитию личности.

Архив выпусков рассылки находится здесь http://blackbox.mailru.com



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное