随笔分类 - 数据结构
从新回忆数据结构
摘要:前言 马踏棋盘 概念在这,不做过多复述。 https://baike.sogou.com/v58959803.htm?fromTitle=%E9%A9%AC%E8%B8%8F%E6%A3%8B%E7%9B%98 思路是这样子的,一匹马有上面几种做法,然后进行尝试,然后回溯即可。 我的测试结果是没有用
阅读全文
摘要:前言 佛洛伊德算法和迪杰斯特拉算法非常像,但是它求的是任何一个点到其他点之间的距离。 假设有一张图: 转换为矩阵为: 他们的前驱为: 可能上面表述前驱不清楚,举个例子。 看下图: 这第二种图表示,从A 经过A 到B,B点的前驱是A,他们的长度是5,红框中的数表示是A经过的点。 现在A到不了D,A经过
阅读全文
摘要:前言 迪杰斯特拉算法 是求最短路径方法的其中一种,这个有什么作用呢? 有一张图: 假设求G点到其他各点的最小路径。 是这样来的。 比如找到了和G点相连接所有点,ABED。这时候确定GA是一定是最短的,为什么这么说呢?G->A和G从别的点到A,一旦G走BED 一定会大于GA,后续就跟不可能大于了。 所
阅读全文
摘要:前言 这个和前面一节有关系,是这样子的,前面是用顶点作为参照条件,这个是用边作为参照条件。 正文 图解如下: 每次选择最小的边。 但是会遇到一个小问题,就是会构成回路。 比如说第四步中,最小边是CE,但是没有选择CE,因为CE会形成回路。 那么如何判断是否有回路呢? 判断两个点的终点,是否一致。 这
阅读全文
摘要:前言 看一个题目: 这个问题就是求最小生成树,是图转换为树的一种方式。 最小生成树概念: 最小生成树简称MST。 1.n个顶点,一定有n-1条边 2.包含全部顶点。 3.图转换为最小生成树,权重之和最小。 解题思路: 假设从a开始为顶点,找到和a相接的最小边。 在图中和a相接的是G,那么选择条。然后
阅读全文
摘要:前言 贪心算法,记得学的时候还是大学的时候,再次来总结一下吧。 贪心算法并不是指具体的固定代码,而是指一种思路,加入我们每次都选最好的选择,那么很大可能会得到最好的结果。 题目: 正文 思路,加入把k1到k5轮询一遍,发现k1、k2、k3可以覆盖范围最多,随便取一个,假设取k1。 那么剩下广播地区就
阅读全文
摘要:前言 很多人把KMP和暴力破解分开,其实KMP就是暴力破解,整个高大上的名字,难道还不是去试错匹配吗? KMP是这样子的,比如说: 绿色部分是我要匹配的。 按照一般写法是这样子的: ABABA 去匹配 ABABC 发现匹配不了,然后后移一位用BABACDEFG 去匹配 ABABC。 KMP在此做了优
阅读全文
摘要:前言 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。 这样一听和分治算法有点相似啊。 是的,分治算法也是将大问题分为小问题,但是他们毕竟不同,不同之处在什么地方呢? 分治算法是这样的,本来有一个大问题,把他们呢分成10个独立的小问题,每个问题都可以单独执行。
阅读全文
摘要:前言 有一个汉罗塔的游戏如下: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根
阅读全文
摘要:前言 前面写过二分法使用的是递归手法,然后该节才有不递归的方式执行。 二分法的时间复杂度为log(2)n。空间复杂度为:1。 正文 代码: static void Main(string[] args) { int[] arr = {1,3,8,10,11,67,100 }; int index=
阅读全文
摘要:前言 因为有些树是这样子的: 这样子的树有个坏处就是查询效率低,因为左边只有一层,而右边有3层,这就说明如果查找一个数字大于根元素的数字,那么查询判断就更多。 解决方法就是降低两边的层数差距: 变成这样。 那么如何这样做呢? 如果右边比左边层次大于1,进行左旋转规格: 如果左边比右边层次大于1,进行
阅读全文
摘要:前言 续前一章。 正文 删除节点规则: 1.假如删除的是叶子节点,让他的父节点,断开和它的联系。 2.如果删除节点右左子树或者右子树的话,那么应该这样。 如果删除节点是它的父节点的左节点,而删除节点有左节点,那么删除节点的父节点的左节点就等于删除节点的左节点。 举个栗子哈: 假如要删除的是15,那么
阅读全文
摘要:前言 什么是二叉堆排序呢? 就是上面这种,一个节点大于左节点,但是小于右节点,再我写的例子中会写出大于等于右节点。 那么如何让一个数组进行变成这种二叉树呢? 其实只要有规律就很简单。 第一个元素(0)作为根节点。 第二个元素如果比第一个元素则判断是否有左节点,如果没有左节点,就是它的左节点,如果有左
阅读全文
摘要:前言 将下面按照从小到大排序: int[] arr = { 4, 6, 8, 5, 9 }; 这时候可以通过冒泡排序,计数排序等。 但是一但数据arr很大,那么会产生排序过于缓慢,堆排序就是一个很好的解决方案。 树的堆,有最大堆和最小堆。 看下最大堆: 它是这样子的,就是说一个节点的大小一定大于它的
阅读全文
摘要:前言 为什么会有线索化二叉树呢? 是这样子的,二叉树呢,比如有n个节点,那么就有n+1个空指针域。 这个是怎么来的呢?比如我们假如一个节点都有左子树和右子树,那么就有2n个节点。 但是我们发现连接我们节点的一共有n-1个(要把n个节点串起来),那么就等于2n-(n-1)=n+1。 那么如何利用这些空
阅读全文
摘要:前言 二叉树顺序存bai储是二叉树的一种存储方式。将二du叉树存储在一zhi个数组中,通过存储元素的下dao标反映元素之间的父子关系。 正文 这个概念比较简单,比如一个节点的在数组的index是x,那么它的左节点就是2x+1,右节点就是2x+2。 代码: public class ArrBinary
阅读全文
摘要:前言 你好这里的一个删除,指的是如果删除的叶子节点则直接删除,如果删除的是非叶子节点,则删除的是这颗子树。 这样删除的场景并不多,这种删除方式了解即可。 十七和十六没有放树图,把树图放一下。 正文 节点模型: public class HeroNode { private int no; priva
阅读全文
摘要:前言 树的前中后序遍历 是根据前中后序的顺序来查找,找到了则弹出。 正文 节点模型: public class HeroNode { private int no; private string name; private HeroNode left; private HeroNode right;
阅读全文
摘要:前言 理论文章: 直接看百度百科。 这个比较简单,直接放c#代码。 正文 建立节点模型: public class HeroNode { private int no; private string name; private HeroNode left; private HeroNode righ
阅读全文
摘要:前言 为什么有这个哈希链表呢? 首先来看一张图: 这种就是哈希链表。为什么要这样做呢? 如果是数组存储的话,存在一个问题,那就是扩容。 如果是链表的时候,那么存在查询需要遍历整个链表。 这个哈希链表就是两者的结合。 正文 代码如下: class HashTab { private EmpLinked
阅读全文
浙公网安备 33010602011771号