
C#数据结构
Moyiii
Simplify the knowledge and deepen your mind.
展开
-
C# 中 Dictionary 的 Capacity 问题
我们知道C#中的容器,其基础规则是以2倍的翻倍策略进行内存扩增的,我们也经常会通过统计容器的Capacity来统计内存占用。像List这种简单的线性结构。Capacity作为公开的属性是直接可以获取到的。但是像Dictionary这种复杂结构,我们不能直接拿到Capacity属性,那怎么办呢,我们可以通过反射的方法,简单计算下内存占用。我们只统计了桶的大小,并没有统计Entry的大小,感兴趣的同学可以自己试一下这个结果是89,因为它需要保证桶的大小是质数其中还有一个有趣的问题,如果你看过C#字典的源代原创 2022-06-15 11:42:26 · 1055 阅读 · 0 评论 -
C# 索引优先队列(索引堆)
在求Dijkstr最短路径的时候,我们会用到索引优先队列,因为堆中的值会随着遍历过程中被更新,这就需要一个支持定点更新的堆数据结构。从而保证log(n)的复杂度需求public class IndexPriorityQueue<T> where T : IComparable<T> { private int MaxSize; private int n; private T[] Keys; private原创 2021-06-25 16:34:05 · 303 阅读 · 0 评论 -
C# 并查集
最近测试了下并查集,发现之前写的效率不是很高。一定要进行路径压缩的情况下,查询的均摊效率才接近反阿卡曼函数,可以约等于常数,这里并没有统计权值,速度会略慢,但是也比较快了,而且省了一些空间。 class UnionSet { private int[] parent; private int groupNum; public UnionSet(int n) { parent = new int[n]原创 2021-06-24 20:52:35 · 405 阅读 · 2 评论 -
C#最小堆实现
最近看了《算法》第四版这本书,里边关于优先队列讲的确实非常好,之前自己写过的最小堆代码过于臃肿了,这次重构一下,记录发上来public class Heap<T> where T : IComparable<T>{ readonly List<T> m_heap; public int Count => m_heap.Count - 1; public Heap() { m_heap = new List&原创 2021-06-15 13:40:41 · 231 阅读 · 1 评论