随笔分类 - C#
摘要:.NET多年以前已经开始支持Docker,但由于国内.net现状,生产过程中几乎用不到docker支持,趁着有点时间捣鼓下~。 先期工作 1、首先安装 Docker Desktop 2、安装Visual Studio 创建项目 使用VS分别创建一个ASP.NET Core Api(WebApplic
阅读全文
摘要:在开始之前我们先了解几个名词: 1、什么是函数式编程:函数式编程属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用,可以说是面向过程的程序设计。 2、函数式编程的优势: 1)函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。 2)易于"并发编程" 。 3
阅读全文
摘要:先看段代码: 1 for (int i = 0; i < 10; i++) 2 { 3 Task.Factory.StartNew(()=>Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ~ {i}")); 4 } 从代码上可以看
阅读全文
摘要:记忆化,是一种为了提高应用程序性能的FP技术。程序加速是通过缓存函数的结果实现的,避免了重复计算带来的额外开销。 1、现在我们使用Dictionary作为缓存结构 1 public static Func<T, R> Memoize<T, R>(Func<T, R> func) 2 where T
阅读全文
摘要:什么是赫夫曼树? 赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小。哈夫曼树(也称为最优二叉树)是带权路径长度最短的树,权值较大的结点离根较近。 1 public class HNode<T> 2 { 3 public HNode()
阅读全文
摘要:为什么线索化二叉树? 对于二叉树的遍历,我们知道每个节点的前驱与后继,但是这是建立在遍历的基础上,否则我们只知道后续的左右子树。现在我们充分利用二叉树左右子树的空节点,分别指向当前节点的前驱、后继,便于快速查找树的前驱后继。 不多说,直接上代码: /// <summary> /// 线索二叉树 节点
阅读全文
摘要:对比上一篇文章“顺序存储二叉树”,链式存储二叉树的优点是节省空间。 二叉树的性质: 1、在二叉树的第i层上至多有2i-1个节点(i>=1)。 2、深度为k的二叉树至多有2k-1个节点(k>=1)。 3、对任何一棵二叉树T,如果其终结点数为n0,度为2的节点数为n2,则n0=n2+1。 4、具有n个节
阅读全文
摘要:什么是二叉树:每个树的节点只有两个子树的树形结构。 为什么使用顺序存储结构:使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号,从而对这些结点进行访问,这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法。 /// <summary>
阅读全文
摘要:c# linq用起来特方便,因此我们习惯性的用list来操作。 这里我们将 DataTable 一列转为List: List<T> homeworkIdList = (from r in dataTable.AsEnumerable() select r.Field<T>("列名")).ToList
阅读全文
摘要:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现
阅读全文