2012-05-06 2 views
0

Мне нужно реализовать дерево B +, которое предназначено для отображения k -d. В качестве краткого объяснение этого, k -d tree похоже на двоичное дерево, за исключением того, что на его узлах он имеет многозначный ключ, то есть ключ с несколькими значениями. И это будет также быть деревом B +, потому что внутренние узлы предназначены только для хранения 1 значений ключа, а реальные данные хранятся на листовых узлах. Вот краткий графическое объяснение этого:Как реализовать с OO набор ключей в C++ для kdtree

short graphical explanation

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

Когда я добавить 4-ый элемент, так как Том и Линда имеют возраст меньше, чем 27, они уже завершенного листовой узел, сын добавления Dom делает узел снова расщепляется, , но на этот раз я должен переключиться, какое значение ключа определяет порядок, который составляет Номер социального страхования. Снова я принимаю медианное значение, и результат равен 530, поэтому все те, у кого SS-номер меньше 530, идут влево и так далее.

Результирующее с окончательным к -d дерева, с определенными значениями ключа в качестве индекса в внутренних узлов, а также полный ключ в узлах листьев.

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

Вы можете заметить сходство с базой данных, где мы имеем несколько полех со значениями, и мы можем сортировать информацию с различными областями, в то же время , одна важнее другой, и так далее.

Я считал, что делает class имени Key или любое другое имя, с atributes что держать все значения, для приведенного выше примера, это может быть int для возраста и int для SSNumber и string для имени. Но моя проблема в том, что, если мой клиент решает, что хочет добавить больше значений, тогда мой класс будет становиться все больше и больше. Является ли это хорошим решением OO? Могу ли я реализовать это другим способом и все еще быть OO? Я знаю, что мое воображение может быть плохим, но поскольку я могу предположить, что клиент хочет больше значений, я могу сделать какой-то список, содержащий мои значения, то это значит, что я бы получил , чтобы составить список, который может поддерживать любые типы данных , что не похоже на подход OO . Есть идеи?

Также я хочу добавить, что, так как в какой-то момент моего алгоритма дерева плохого необходимости принять 1 атрибут ключа для использования в качестве индекса в дереве, я должен поддержку и это.

Я очень благодарен за идею о том, как это решить, следуя подходу OO .

ответ

1

Сделать Key массив KeyPart, то каждый тип значения ключа (возраст, сс #) может унаследовать от KeyPart. Затем каждый внутренний узел вашего дерева может хранить один KeyPart и индекс ключевой части (чтобы узнать, какая часть - это раскол). Листья могут хранить полный Key.

+0

Это WOW, удивительное решение, спасибо вам большое! Только один вопрос, я не уверен, что вы подразумеваете под «индексом ключевой части», как число, которое отображает каждый подкласс? Во всяком случае, я сейчас очень уверен, что могу работать с этой идеей, я могу понять, что остальное. Еще раз большое спасибо! – Ale

+0

Не обращайте внимания на мой вопрос об индексе ключевой части, я полностью понимаю его сейчас. Ваш ответ - это то, что мне нужно. – Ale

Смежные вопросы