Оптимизация поиска в дереве

 

Основное свойство дерева соответствует пословице " дальше в лес - больше дров" . Точнее, количество просматриваемых вершин от уровня к уровню растет в геометрической прогрессии. Если известен некоторый критерий частоты использования различных элементов данных (например, более короткие строки используются чаще, чем длинные), то в соответствии с ним можно частично упорядочить данные по этому критерию с точки зрения их " близости" к корню : в нашем примере в любом поддереве самая короткая строка находится в его корневой вершине. Алгоритм поиска может ограничить глубину просмотра такого дерева.

//--- Дерево оптимизацией : короткие ключи ближе к началуstruct dtree{char *key; // Ключевое словоvoid *data; // Искомая информацияdtree *p[4]; }; // Потомкиvoid *find(dtree *q, char *keystr) // Поиск по ключу{ void *s;if (q==NULL) return NULL;if (strcmp(q->key,keystr)==0) return q->data; // Ключ найденif (strlen(keystr)<strlen(q->key)) return NULL; // Короткие строки - ближе к корнюfor (int i=0; i< 4; i++) if ((s=find(q->p[i],keystr))!=NULL) return s;return NULL; }

Функция включения в такое дерево ради сохранения свойств должна в каждой проходимой ею вершине рекурсивно " вытеснять" более длинную строку в поддерево и заменять ее на текущую (новую), более короткую.