我想知道人们如何在不使用基类库实现的情况下在C#中实现以下数据结构: -
以及人们可以想到的任何其他基本数据结构!
我很好奇,因为我希望提高对这些数据结构的理解,很高兴看到C#版本而不是互联网上的典型C示例!
答案 0 :(得分:9)
这个主题有一系列MSDN articles。但是,我自己并没有真正阅读过该文本。我相信.NET的集合框架有一个破坏的界面,无法很好地扩展。
还有C5,我正在调查的图书。
由于上面提到的原因,我已经有了为.NET实现我自己的集合库的项目,但是在第一个基准测试显示即使是一个简单的,非线程安全的泛型{{1实现比本机Vector
慢。由于我已经注意不要生成任何效率低下的IL代码,这意味着.NET不适合(还)用于编写内部数据结构的替换,并且.NET框架必须使用一些后面的 - -scenes知识来优化内置集合类。
答案 1 :(得分:4)
这是一个通用的二进制搜索树。我唯一没做的就是实现IEnumerable< T>所以你可以使用枚举器遍历树。然而,这应该是相当直接的。
特别感谢Scott Mitchel的BSTTree文章,我将其作为删除方法的参考。
节点类:
class BSTNode<T> where T : IComparable<T>
{
private BSTNode<T> _left = null;
private BSTNode<T> _right = null;
private T _value = default(T);
public T Value
{
get { return this._value; }
set { this._value = value; }
}
public BSTNode<T> Left
{
get { return _left; }
set { this._left = value; }
}
public BSTNode<T> Right
{
get { return _right; }
set { this._right = value; }
}
}
实际的Tree类:
class BinarySearchTree<T> where T : IComparable<T>
{
private BSTNode<T> _root = null;
private int _count = 0;
public virtual void Clear()
{
_root = null;
_count = 0;
}
public virtual int Count
{
get { return _count; }
}
public virtual void Add(T value)
{
BSTNode<T> newNode = new BSTNode<T>();
int compareResult = 0;
newNode.Value = value;
if (_root == null)
{
this._count++;
_root = newNode;
}
else
{
BSTNode<T> current = _root;
BSTNode<T> parent = null;
while (current != null)
{
compareResult = current.Value.CompareTo(newNode.Value);
if (compareResult > 0)
{
parent = current;
current = current.Left;
}
else if (compareResult < 0)
{
parent = current;
current = current.Right;
}
else
{
// Node already exists
throw new ArgumentException("Duplicate nodes are not allowed.");
}
}
this._count++;
compareResult = parent.Value.CompareTo(newNode.Value);
if (compareResult > 0)
{
parent.Left = newNode;
}
else
{
parent.Right = newNode;
}
}
}
public virtual BSTNode<T> FindByValue(T value)
{
BSTNode<T> current = this._root;
if (current == null)
return null; // Tree is empty.
else
{
while (current != null)
{
int result = current.Value.CompareTo(value);
if (result == 0)
{
// Found the corrent Node.
return current;
}
else if (result > 0)
{
current = current.Left;
}
else
{
current = current.Right;
}
}
return null;
}
}
public virtual void Delete(T value)
{
BSTNode<T> current = this._root;
BSTNode<T> parent = null;
int result = current.Value.CompareTo(value);
while (result != 0 && current != null)
{
if (result > 0)
{
parent = current;
current = current.Left;
}
else if (result < 0)
{
parent = current;
current = current.Right;
}
result = current.Value.CompareTo(value);
}
if (current == null)
throw new ArgumentException("Cannot find item to delete.");
if (current.Right == null)
{
if (parent == null)
this._root = current.Left;
else
{
result = parent.Value.CompareTo(current.Value);
if (result > 0)
{
parent.Left = current.Left;
}
else if (result < 0)
{
parent.Right = current.Left;
}
}
}
else if (current.Right.Left == null)
{
if (parent == null)
this._root = current.Right;
else
{
result = parent.Value.CompareTo(current.Value);
if (result > 0)
{
parent.Left = current.Right;
}
else if (result < 0)
{
parent.Right = current.Right;
}
}
}
else
{
BSTNode<T> furthestLeft = current.Right.Left;
BSTNode<T> furthestLeftParent = current.Right;
while (furthestLeft.Left != null)
{
furthestLeftParent = furthestLeft;
furthestLeft = furthestLeft.Left;
}
furthestLeftParent.Left = furthestLeft.Right;
furthestLeft.Left = current.Left;
furthestLeft.Right = current.Right;
if (parent != null)
{
result = parent.Value.CompareTo(current.Value);
if (result > 0)
{
parent.Left = furthestLeft;
}
else if (result < 0)
{
parent.Right = furthestLeft;
}
}
else
{
this._root = furthestLeft;
}
}
this._count--;
}
}
}
答案 2 :(得分:2)
我建议你提到的数据结构有两个资源: 首先,有.NET Framework源代码(可以在ScottGu的博客here上找到信息)。
另一个有用的资源是在Codeplex here上找到的Wintellect的Power Collections。
希望这有帮助!
答案 3 :(得分:2)
“提供未在标准.NET框架中实现的通用数据结构和算法的类库。”
答案 4 :(得分:0)
查看转子2(http://research.microsoft.com/sscli/)或使用反射器(http://www.red-gate.com/products/reflector/),看看微软是如何做到的!