Реализация структур объектов: какой тип данных использовать? - PullRequest
2 голосов
/ 11 июня 2010

Говоря упрощенно, структура объекта представляет собой неупорядоченный список пар атрибут-значение.

[number:sg, person:3 | _ ],

, которые могут быть встроены:

 [cat:np, agr:[number:sg, person:3 | _ ] | _ ],

может подиндексировать материал и совместно использовать значение

[number:[1], person:3 | _ ],

, где [1] - это еще одна структура объектов (то есть, она допускает повторный вход).

Мой вопрос: с какой структурой данных люди думают, что она должна быть реализована для последующего доступа?значениям, выполнить объединение между 2 fts, «напечатать» их и т. д.

Существует полная книга по этому вопросу, но она написана на языке lisp, что упрощает обработку списка.Итак, мой выбор: хэш списков, список списков или три.Что люди думают об этом?

1 Ответ

1 голос
/ 11 июня 2010

Подумайте немного больше о том, что представляет собой ценность.Я бы попробовал простейшую вещь, которая могла бы сработать:

typedef struct value {
   enum { INT, BOOL, STRING, FEATURE_STRUCTURE } ty;
   union {
     int int;
     bool bool;
     char *string;
     struct fs *feature_structure;
   } u;
} *Value;

typedef struct fs * { // list of pairs; this rep could change
    struct avpair *pair;
    Value value;
} *Feature_Structure;

struct avpair {
   const char *attribute;
   Value value;
};

Вам понадобится куча функций конструктора, таких как

Value mkBool(bool p) {
  Value v = malloc(sizeof(*v));
  assert(v);
  v->ty = BOOL;
  v->u.bool = p;
  return v;
}

На этом этапе вы можете начать работать,Если «список пар» оказывается неправильным представлением, вы можете изменить его.Не зная, какие операции вы планируете или каковы ваши ожидания от модели затрат, я бы начал здесь.Затем, если вам нужно перейти к чему-то более эффективному, я бы, вероятно, представил структуру объектов с использованием троичного дерева поиска и сохранил бы то же представление для Value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...