Кстати, на самом деле я действительно реализовал btree в C# для личного проекта. Это было весело. Я построил btree из лексикографически упорядоченного ключа с переменным размером (до 64 байт), который представлял ряд проблем, особенно в том, что касается выяснения, когда страница хранилища слишком заполнена или слишком пуста.
Мой совет, только что сделал это, состоит в том, чтобы построить слой абстракции, который захватывает только алгоритмы btree в их самой абстрактной форме, как абстрактный базовый класс. После того, как я получил все правила btree, записанные в этой форме, я специализировал базовый класс несколькими различными способами: как обычный 2-3-битный размер с фиксированным ключом, как один из моих причудливых btrees с переменным размером и т. Д. ,
Для начала, ни при каких обстоятельствах не следует делать это с помощью указателей. Небезопасный код редко необходим и никогда не бывает легким. Только самые продвинутые программисты на C# должны отключать систему безопасности; когда вы это делаете, вы берете на себя ответственность за тип и безопасность памяти программы. Если вы не хотите этого делать, оставьте систему безопасности включенной.
Во-вторых, нет причин для создания этой структуры. Структуры копируются по значению в C#; узел btree не является значением .
В-третьих, вам не нужно хранить количество ключей в узле; массив ключей знает, сколько ключей в нем.
В-четвертых, я бы использовал List<T>
, а не массив; они более гибкие.
В-пятых, вы должны решить, являются ли ключевые жизни в узле или в родителя. В любом случае это может работать; я предпочитаю, чтобы ключ находился в узле, потому что я вижу ключ как связанный с узлом.
В-шестых, полезно знать, является ли узел btree корнем или нет; вы можете подумать, что у вас есть два дурака, один - это лист? и один «это корень?» Конечно, btree с одним элементом в нем имеет единственный узел, который является как листом, так и корнем.
В-седьмых, вы, вероятно, собираетесь построить эту вещь для изменения; обычно один класс не делает общедоступными изменяемые поля в классе C#. Вы можете подумать о том, чтобы сделать их свойствами. Кроме того, список детей можно выращены и сократилась, но его идентичность не меняется, так что это референциально только для чтения:
Так что я, вероятно, структурировать мой основной узел, как:
class Node
{
public int Key { get; set; }
public bool IsRoot { get; set; }
public bool IsLeaf { get; set; }
private List<Node> children = new List<Node>();
public List<Node> Children { get { return this.children; } }
}
Имеют смысл?
Почему вы хотите использовать структуру вместо класса? – CodesInChaos
, конечно, вы можете использовать C# для деревьев B – Adrian
Не пытайтесь использовать небезопасный код на C#, пока не станете экспертом; вы получите это неправильно, и это будет болезненно и сложно. Скорее, научитесь безопасному способу делать что-то в первую очередь; C# разработан так, что безопасный способ делать вещи почти всегда проще, чем небезопасный способ. –