![](https://img-blog.csdnimg.cn/20190216151524302.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 90
数据结构与算法
鹅厂程序小哥
与你一起写程序 | 知乎:鹅厂程序小哥 | 微信公众号:鹅厂程序小哥
展开
-
【最通俗易懂】MySQL索引原理
MySQL底层使用的存储结构是B+树,那为什么选择B+树,我们对不同的存储结构对比分析一下,请看下文,尽量用通俗的话讲清楚。首先假设我们有这么一张MySQL表user id name 1 Richard 2 Erlich 3 Jared 4 Nelson 5 Gil原创 2021-02-01 12:44:13 · 441 阅读 · 1 评论 -
最短路径算法-迪杰斯特拉(Dijkstra)算法
最短路径算法-迪杰斯特拉(Dijkstra)算法迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止。基本思想通过Dijkstra计算图G中的最短路径时,需要指定一个起点D(即从顶点D开始计算)。 此外,引进两个数组S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点D的距离)。 初始时,数组S中只有起原创 2021-01-02 23:22:13 · 2706 阅读 · 0 评论 -
分治法,动态规划法,贪心法,回溯法,分支限界法的区别和联系以及适用情况
《算法设计与分析》课程已经进入尾声,在这里对学过的算法进行总结归纳。笔者先对各个算法的思想进行简单的陈述,然后再进行对比。一、算法思想(一)分治法(divide and conquer method)是将待求解的原问题划分成k个较小规模的子问题,对这k个子问题分别求解。如果子问题的规模仍然不够小,则再将每个子问题划分为k个规模更小的子问题,如此分解下去,直到问题规模足够...转载 2019-04-21 20:14:08 · 4678 阅读 · 0 评论 -
五大常用算法--分支限界算法
分支限界法的基本思想 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。 此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一...转载 2019-04-21 22:37:24 · 1079 阅读 · 0 评论 -
五大常用算法--回溯算法
回溯算法的基本思想 回溯法采用深度优先方法搜索遍历问题的解空间树,可以看作是蛮力法穷举搜索的改进。先判断该节点对应的部分是否是满足约束条件,也就是判断该节点是否包含问题的最优解。如果肯定不包含,则跳过对该节点为根的子树的搜索,即所谓的剪枝;否则,进入该节点为根的子树,继续按照深度优先策略搜索。回溯法常常可以避免搜索所有可能的解,所以,适用于求解组合数组较大的问题。 ...转载 2019-04-21 17:09:37 · 791 阅读 · 0 评论 -
C#--二叉树的遍历(递归和非递归)
二叉树的遍历包含四种遍历方式:前序遍历中序遍历后序遍历层次遍历一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现// 前序遍历:首先访问根结点,然后遍历其左子树,最后遍历其右子树。 private void PreOrder(TreeNode<T> node) { if (nod...原创 2019-03-01 21:27:19 · 2175 阅读 · 0 评论 -
C#--事件的一个面试题
话不多说,先看代码:using System;namespace ConsoleApp2{ class Class21 { public delegate void MethodCall(); public static event MethodCall MethodHandle; static void Main(str...原创 2019-03-01 13:56:14 · 359 阅读 · 0 评论 -
C#--委托(Delegate)和事件(Event)
委托在本质上仍然是一个类,我们用delegate关键字声明的所有委托都继承自System.MulticastDelegate。后者又是继承自System.Delegate类,System.Delegate类则继承自System.Object。委托是一种类型安全的函数回调机制, 它不仅能够调用实例方法,也能调用静态方法,并且具备按顺序执行多个方法的能力。1. 委托也好,事件也好最初的起源是C/C...原创 2019-03-01 12:31:29 · 637 阅读 · 0 评论 -
C#--静态构造函数
静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数。静态构造函数的特点:静态构造函数没有修饰符修饰(public,private),因为静态构造函数不是我们程序员调用的,是由.net 框架在合适的时机调用的。 静态构造函数没有参数,因为框架不可能知道我们需要在函数中添加什么参数,所以规定不能使用参数。 静态构造函...原创 2019-02-28 22:22:27 · 1580 阅读 · 0 评论 -
C#--字符串常量池
在介绍字符串常量池之前,先看一段简单的代码:using System;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { string a = "123"; string b = "...原创 2019-02-27 22:42:13 · 3184 阅读 · 3 评论 -
C#--温习IO操作
在.NET框架中进行的所有IO操作都要用到流(Stream)。System.IO命名空间中包含许多IO相关的类,C#文件读写的类几乎都在其中,下面对其进行详细介绍。主要类列表:类 说明 BinaryReader 用特定编码将基元数据读作二进制值。 BinaryWriter 以二进制形式将基元类型写入流,并支持用特定的编码写入字符串 BufferedSt...转载 2018-10-09 20:51:41 · 233 阅读 · 0 评论 -
C#--输入和输出FileStream、BinaryReader和BinaryWriter、StreamReader和StreamWriter总结
为什么要出现与文件流配套的读写器类型呢?主要是因为文件流对象(FileStream)在读写字节的效率是相当高的,但是在处理其他类型的数据时会比较麻烦,所以就出现了二进制读写器(BinaryReader和BinaryWriter)和文本读写器(StreamReader和StreamWriter)来解决这一问题。FileStream类:using System;using System....原创 2018-08-23 16:29:28 · 3592 阅读 · 0 评论 -
C#数据结构--反射
反射是程序可以访问、检测、修改它本身状态或行为一种能力。 程序集包括模块,模块包括类型,类型又包括成员。反射可以提供封装程序集、模块和类型的对象。 反射可以动态的创建类型的实例,把类型绑定在现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。代码是在Unity中实现的,其实,在纯C#环境中,只要把Start方法中的代码放入Main方法中即可。...原创 2018-08-22 17:27:13 · 417 阅读 · 0 评论 -
C#--委托和事件的区别
原文链接:http://www.cnblogs.com/kissazi2/p/3189685.html从本篇文章中,我们将从代码层面知道委托和事件的差异和用处,并且我们不会用猫和老鼠之类奇怪的比喻来混淆大家。首先,我们知道委托和事件都可以用来调用跟自己方法签名一样的方法。容易混淆大家的地方大多在于这两者之间的区别。从我们使用委托delegate和事件event上的主要有两大区别(如表1所示...转载 2018-05-15 22:23:02 · 1649 阅读 · 1 评论 -
C#--序列化和反序列化
序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存、数据库或文件的过程。 它的主要用途是保存对象的状态,以便能够在需要时重新创建对象。 反向过程称为“反序列化”。序列化的工作原理下图展示了序列化的整个过程。对象序列化若要序列化对象,需要具有要序列化的对象、包含已序列化对象的一个流,以及一个 Formatter。将 SerializableAttribute 特性应用于某个类型,以指示此类...原创 2018-05-15 17:37:54 · 460 阅读 · 0 评论 -
C#--异步回调
异步回调:主线程在执行的时候,打开一个子线程,主线程继续执行,当子线程执行完成的时候,主线程立即输出主线程的运行结果,主线程继续执行。注意:1.调用BeginInvoke开始异步加载, 在 ThreadPool 线程上执行回调方法,而不是在主线程。2.调用 EndInvoke 来完成异步调用。3.定义的委托,可以没有参数,没有返回值,看具体功能需求。using System...原创 2018-05-15 16:43:44 · 3103 阅读 · 0 评论 -
using关键字在C#中的用法
using 关键字有两个主要用途: (一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。 (二).作为语句,用于定义一个范围,在此范围的末尾将释放对象。(一).作为指令1、用在命名空间里 using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到。 ...原创 2018-05-13 23:51:13 · 212 阅读 · 0 评论 -
String类型 在底层剖析
一、String在任何语言中,都有它的特殊性,在.NET中也是如此。它属于基本数据类型,也是基本数据类型中唯一的引用类型。字符串可以声明为常量,但是它却放在了堆中。 在.NET中String是不可改变对象,一旦创建了一个String对象并为它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值。using System;namespace Demo1{ ///<summar...原创 2018-05-13 23:27:24 · 317 阅读 · 0 评论 -
C#中抽象类和接口的区别
一、抽象类:抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。二、接口:接口是引用类型的,类似于类,和抽象类的相似之处有三点:1、不能实例化;2、包含未实现的方法...原创 2018-05-13 23:11:47 · 232 阅读 · 0 评论 -
C#--托管堆、堆栈、垃圾收集器和不安全代码的工作原理和方式
掌握托管堆、堆栈、垃圾收集器和不安全代码的工作原理和方式,将有助于你成为真正的优秀C#程序员。栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。在编程中,例如C/C++中,所有的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的...转载 2019-03-06 10:51:37 · 380 阅读 · 0 评论 -
C#数据结构-Dictionary实现
在看过一篇大神写的《带你看懂Dictionary的内部实现》,对Dictionary的内部实现有了一个清晰的了解,但纸上得来终觉浅,作为程序员,还是自己调试一下代码,记忆更深刻,为此专门拷贝出C#的Dictionary源码,因为源码有很多保护级别的代码,不能直接运行。下面贴出我调试没有问题的Dictionary源码(有部分代码没有重写),并附带官方调用实例,方便断点调试。Dictionary源码:...原创 2018-03-12 18:02:31 · 2905 阅读 · 0 评论 -
带你看懂Dictionary的内部实现
了解Dictionary的开发人员都了解,和List相比,字典添加会慢,但是查找会比较快,那么Dictionary是如何实现的呢?Dictionary的构造下面的代码让我们看看Dictionary在构造时都做了什么private void Initialize(int capacity) { int prime = HashHelpers.GetPrime(...转载 2018-03-12 17:39:29 · 1487 阅读 · 0 评论 -
C#--深拷贝和浅拷贝
浅拷贝与深拷贝:浅拷贝: 仅仅把对象的引用进行拷贝,但是拷贝对象和源对象还是引用同一份实体。此时,其中一个的成员对象的改变都会影响到另一个的成员对象。深拷贝:指的是拷贝一个对象时,不仅仅把对象的引用进行拷贝,还把该对象引用的值也一起拷贝。这样进行深拷贝后的副本对象就和源对象互相独立,其中任何一个的成员对象改动都不会对另外一个成员对象造成影响。C#实现浅拷贝:调用Memberwise...原创 2019-01-11 22:12:59 · 3429 阅读 · 1 评论 -
C#--泛型委托Action<T>、Func<T>、Predicate<T>的解析和用法
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托是保存对某个方法引用的一种引用类型变量。若要引用的方法,具有两个参数没有返回值,使用Action<T1, T2>委托,则不需要显式定义委托。Action<T>委托还有很多重载,根据参数的个数,选择不同的方法重载。若要引用的方法,具有两个参数并返回一个值,使用泛型Func<T1, T...原创 2018-05-17 15:24:56 · 2964 阅读 · 0 评论 -
C#--多态性温习
多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。更通俗的话,就是使用父类型,调用子类中实现的方法。多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。静态多态性在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了...原创 2018-05-13 22:42:00 · 784 阅读 · 0 评论 -
C#数据结构--Dictionary、HashTable、List、HashSet区别
在.Net 模仿java 的过程中,抛弃了 HashMap,所以我们今天分析下Dictionary、HashTable、HashSet区别。处理碰撞,即碰撞到同一个Bucket槽上:Hashtable和Dictionary从数据结构上来说都属于Hashtable(哈希表),都是对关键字(键值)进行散列操作,将关键字散列到Hashtable的某一个槽位中去,不同的是处理碰撞的方法。散列函数...原创 2019-02-25 11:21:11 · 2883 阅读 · 0 评论 -
C#数据结构-八大排序算法
阅读目录1. 冒泡排序2. 选择排序3. 插入排序4. 希尔排序5. 快速排序:初始快速排序、三向切分的快速排序(快速排序的优化版)6. 堆排序7. 归并排序:数组版本、List版本8. 桶排序下面所有的代码,都已经经过vs测试。首先,通用的交换函数Swap:private static void Swap(ref int a, ref int b){ i...原创 2018-03-28 15:00:46 · 4183 阅读 · 2 评论 -
C#数据结构-七大查找算法
阅读目录1. 顺序查找2. 二分查找3. 插值查找4. 斐波那契查找5. 分块查找6. 树表查找7. 哈希查找下面所有的代码,都已经经过vs测试。1.顺序查找基本思想:顺序查找也称为线形查找,属于无序查找算法。C#算法实现:/// <summary> /// 顺序查找 /// </summary> ...原创 2018-03-27 18:14:00 · 6188 阅读 · 2 评论 -
C#--BFS广度优先遍历和DFS深度优先遍历
广度优先搜索(Breadth First Search,简称BFS)从某个节点出发,首先访问该节点,然后依次从它的各个未被访问的邻接点出发,访问邻接点的邻接点。重复此步骤,直到所有的节点都被访问完为止。如上图,广度优先搜索的顺序是:ABCDEFG深度优先搜索(Depth First Search,简称DFS)从某节点出发,在访问了这个节点之后依次访问这个节点的各个未曾访问...原创 2019-02-15 17:39:55 · 1939 阅读 · 1 评论 -
【最通俗易懂】C#有限状态机
翻译:http://wiki.unity3d.com/index.php/Finite_State_Machine有限状态机表示有限个状态以及在这些状态之间的转换和动作等行为的数学模型。 有限状态机框架:Transition enum:此枚举包含可由系统触发的转换标签。StateID枚举:这是游戏具有的状态ID。FSMState类:有限状态机系统中的状态。每个状态都有一个字...翻译 2019-01-04 21:34:02 · 4553 阅读 · 1 评论 -
C#内功修炼(算法)——贪心算法(五)
对于许多最优化问题,使用动态规划算法来求最优解有些杀鸡用牛刀了,可以使用更加简单、更加高效的算法。贪心算法就是这样的算法,它在每一步做出当时看起来最佳的选择。也就是说它总是做出局部最优的选择,从而得到全局最优解。对于某些问题并不保证得到最优解,但对很多问题确实可以求得最优解。贪心算法 - 活动选择问题有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活...转载 2018-04-19 16:51:52 · 582 阅读 · 0 评论 -
C#内功修炼(算法)——动态规划(四)
动态规划(Dynamic Programming)动态规划算法通常基于一个递推公式及一个或多个初始状态。当前子问题的解将由上一次子问题的解推出。动态规划和分治法相似,都是通过组合子问题的解来求解原问题。分治法将问题划分成互不相交的子问题,递归求解子问题,再将他们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。在这种情况下,分治算法会做出许多...转载 2018-04-19 16:51:02 · 604 阅读 · 0 评论 -
C#内功修炼(算法)——堆排序(三 )
堆:堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于等于其左右孩子结点的值,称为小顶堆!堆排序:堆排序算法就是利用堆(小顶堆或者大顶堆)进行排序的方法。将待排序的序列构造成一个大顶堆,此时整个序列的最大值就是根节点。将它移走(跟堆的最后一个元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中...转载 2018-04-19 16:50:04 · 140 阅读 · 0 评论 -
C#内功修炼(算法)——树(二 )
树结构树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的...转载 2018-04-19 16:49:16 · 186 阅读 · 0 评论 -
C#内功修炼(算法)——分治法(一)
分治法(递归的解决问题)分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。可使用分治法求解的一些经典问题(1)二分搜索(2)大整数乘法(3)Strassen矩阵乘法(4)棋盘覆盖(5)合并排序(6)快...转载 2018-04-19 16:46:46 · 609 阅读 · 0 评论 -
【最通俗易懂】A*寻路算法C#实现
A*算法其实也不复杂,首先有以下几个概念: 开启的节点表(OpenList) 存放着所有的待检测的节点(坐标),每次都会从其中寻找出符合某个条件的节点。 关闭的节点表(ClosedList) 存放着所有不会被检测的节点(坐标),每次检测都会忽略它们。 首先,我们定义了两个点,分别是起点和终点。整个算法的核心就是启发式的权值比较,分为G和H值。一般我们将按非斜向方...原创 2018-04-05 17:59:24 · 3633 阅读 · 3 评论 -
C#数据结构-有限状态机
有限状态机FSM的要点是: 拥有一组状态,并且可以在这组状态之间进行切换。 状态机同时只能在一个状态。 一连串的输入或事件被发送给机器。 每个状态都有一系列的转换,转换与输入和另一状态相关。当输入进来,如果它与当前状态的某个转换匹配,机器转为转换所指的状态。 目前而言,游戏编程中状态机的实现方式,有两种可以选择: 用枚举配合switch case语句。 实...原创 2018-04-05 17:22:18 · 2710 阅读 · 0 评论 -
C#数据结构-最小堆实现
最小堆基本思想:堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最小(大)堆,依次类推,最终得到排序的序列。堆排序分为大顶堆和小顶堆排序。大顶堆:堆对应一棵完全二叉树,且所有非叶结点的值均不小于其子女的值,根结点(堆顶元素)的值是最大的。而小顶堆正好相反,小顶...原创 2018-03-31 16:47:21 · 1703 阅读 · 0 评论 -
C#数据结构-string字符串实现
using System;using System.Collections;using System.Collections.Generic;namespace StructScript{ public sealed class StringScript : IEnumerable<char>, IEnumerable, IEquatable<StringSc...原创 2018-03-28 17:41:48 · 908 阅读 · 0 评论 -
C#数据结构-Stack栈实现
using System;using System.Collections.Generic;using System.Collections;namespace StructScript{ public class StackScript<T> : IEnumerable<T> { private T[] mArray; ...原创 2018-03-28 17:37:45 · 446 阅读 · 0 评论