Tag: 数据结构

使用LINQ合并2个数组

我有两个简单的数组,我想使用join linq进行合并: int[] num1 = new int[] { 1, 55, 89, 43, 67, -3 }; int[] num2 = new int[] { 11, 35, 79, 23, 7, -10 }; var result = from n1 in num1 from n2 in num2 select result;

关系的数据结构

我正在将VB6转换为C#,我希望使我的数据结构更有效地保持值和关系。 在VB中,我有一组值和另一组关系,这些值与这些关系的优先级相关。 我还有一个算法,当一组值传递给它时,返回将这些值连接在一起所需的所有关系。 例如,假设值集合包含1-10并且关系集合包含 1,2 3,2 5,2 2,8 8,10 9,10 如果输入是1,9,10,则返回的关系将是 – 1,2 2,8 8,10 9,10 由于可能存在多条路径,因此会返回最少量的关系,但需要注意关系优先级。 如果关系具有更高的优先级,则将添加该关系,并且将从那里添加其余关系。 我正在考虑使用Disjoint-set数据结构,但我不确定。 有任何想法吗? 更多信息 – 值的数量通常小于100且关系小于500.集合是静态的,并且将一次又一次地使用算法来查找路径。 另外,我没有问这个问题,但是Disjoint-set数据结构中的算法是否最有效?

System.Collections.Generic.Dictionary =终极表现?

我正在编写一个haXe C#目标,我一直在研究haXe的std库的性能差异,因此我们可以通过其跨平台代码提供最佳性能。 一个非常好的例子是哈希表代码。 我有点不情愿使用.NET的字典,因为它看起来很笨重(键/值对的结构可能占用大量的内存,因为内存对齐问题,除了它所持有的不必要的信息),并且因为在std上库没有对象哈希这样的东西,我真的以为我可以通过不必调用GetHashCode来压缩一点性能,并一直内联它。 同样很明显,Dictionary实现使用链表来处理冲突,这远非理想。 所以我们开始实现我们自己的解决方案,从IntHash(Dictionary)开始我们首先实现了Hopscotch哈希 ,但实际上并没有很好,但很明显它不支持非常好的哈希表,因为H通常是机器字,并且随着H /长度的增加,性能越差。 然后我们跳转到实现khash -inspired算法。 这个具有很大的潜力,因为它的基准测试令人印象深刻,并且它处理同一arrays上的冲突。 它还有一些很棒的东西,比如resize而不需要像我们那样需要两倍的内存。 基准令人失望。 当然,没有必要说我们的实现中的内存使用量远低于Dictionary的内存使用率。 但我希望也能获得不错的性能提升,但不幸的是情况并非如此。 它不是太低 – 不到一个数量级 – 但对于两组和得分,.NET的实现仍然表现得更好。 所以我的问题是:这是我们对C#的最佳选择吗? 我试着寻找任何自定义解决方案,似乎几乎没有。 有C5通用集合,但代码是如此混乱,我甚至没有测试。 我也找不到基准。 那么……是吗? 我应该包裹Dictionary 吗? 谢谢!!!

如何实现非二叉树

我在实现非二叉树时遇到问题,其中根节点可以具有任意数量的子节点。 基本上,我想了解一下如何使用它的一些想法,因为我确实编写了一些代码,但我仍然坚持下一步该做什么。 顺便说一句,我根本不能使用任何集合类。 我只能使用系统。 using System; namespace alternate_solution { // [root] // / / \ \ // text text text text class Node//not of type TreeNode (since Node is different from TreeNode) { public string data; public Node child; public Node(string data) { this.data = data; this.child = null; } } }

C#中集合数据类型的比较

有谁知道对不同C#集合类型的一个很好的概述? 我正在寻找一些东西,显示支持Add , Remove , RemoveLast等基本操作,并给出相对性能。 对于各种generics类来说会特别有趣 – 如果它显示出来,那就更好了。 如果List之间的性能存在差异,其中T是一个类,而T是一个结构。 一个开始将是抽象数据结构的一个很好的备忘单,比较链接列表,哈希表等等。谢谢!

如何引用具有数百万个节点的树中的子节点

我正在尝试构建一个树,其中每个节点可以有一个未指定数量的子节点。 该树在实践中将拥有超过一百万个节点。 我已经设法构建了树,但是当我用几千个节点填充树时,由于完整堆,我遇到了内存错误。 这是因为我试图将每个节点的子节点存储在Dictionary数据结构(或任何数据结构)中。 因此,在运行时我已经创建了数千个这样的数据结构,因为每个节点可以具有未指定数量的子节点,并且每个节点的子节点将存储在该数据结构中。 还有另一种方法吗? 我不能简单地使用变量来存储子节点的引用,因为每个节点可能有一个未指定数量的子节点。 那么,它不像二叉树,我可以有2个变量分别跟踪左孩子和右孩子。 请不要另外建议这样做的方法。 我有理由需要创建这个树,不幸的是我不能这样做。 谢谢!

.NET Dictionary实现如何与可变对象一起使用

我知道不建议使用“可变”对象(GetHashCode()方法在将它们用作Dictionary中的键时可以返回不同结果的对象)。 下面是我对作为哈希表实现的字典如何工作的理解: 当我添加新密钥时,例如dict.Add(m1, “initially here was m1 object”); , dict使用GetHashCode()方法计算m1的哈希码。 然后它进行一些内部计算,最后将此对象放入其内部数组的某个位置。 当我使用键索引来获取值时,例如dict[m1] , dict再次计算哈希码。 然后它做了一些内部计算,它给了我一个对象,它位于其内部数组内部的计算位置。 但我认为有一个我无法找到的错误。 所以我们假设我有这个代码: class MutableObject { Int32 m_value; public MutableObject(Int32 value) { m_value = value; } public void Mutate(Int32 value) { m_value = value; } public override int GetHashCode() { return m_value; } } static void Main(string[] args) { MutableObject m1 […]

.Net的multiset是否有任何实现?

我正在寻找一个多集的.Net实现。 任何人都可以推荐一个好的吗? (多集或包,是一个可以具有重复值的集合,您可以在其上设置操作:交集,差异等。例如,购物车可以被认为是多集,因为您可以多次出现相同的产品。)

双向字典?

我有两组对象,在某些情况下,第一组将用作另一组的键,而在其他情况下,第二组将用作第一组的键。 此外,两个列表中都不得有重复项。 什么是一个好的数据结构用于此? 我应该使用两个字典还是有更聪明的方法?

C#Struct使用技巧?

我喜欢使用结构。 因此,在阅读本文后 ,我是否应该反对使用它们? 也可以看看: 我什么时候应该使用结构而不是类? 何时在C#中使用struct?