- 博客(37)
- 收藏
- 关注
原创 C语言字符与字符串
字符首先我们知道字符类型的数据是用char来定义的,一个字符占一个字节,且字符类型其实是一种特殊的整型或者说整型是一种特殊的字符类型#include <stdio.h>int main(){ char a=172; int b='f'; printf("%c,%d",a,b);}若上述代码所示,无论你是用int去定义一个变量,变量里放着一个字符还是用char去定义一个变量,变量里放着一个整数,编译都不会报错,区别只在于最后的输出,%c输出字符类型,但底层是编译器去找ASCLL
2021-01-03 23:29:18 613
原创 克鲁斯卡尔算法生成最小生成树
克鲁斯卡尔算法的介绍1)克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。2)基本思想:按照权值从小到大的顺序选择 n-1条边,并保证这 n-1条边不构成回路3)具体做法:首先构造一个只含 n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止首先我们得明白,在解决求最小生成树的算法里,主要就是克鲁斯...
2020-02-22 17:05:23 12741 2
原创 普利姆算法生成最小生成树
普里姆算法介绍普利姆(Prim)算法求最小生成树,也就是在包含 n个顶点的连通图中,找出只有(n-1)条边包含所有 n个顶点的连通子图,也就是所谓的极小连通子图什么是最小生成树最小生成树(Minimum Cost Spanning Tree),简称 MST。给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树,如图简而言之,最小生成树就是将图中所...
2020-02-22 16:45:19 8344 2
原创 贪心算法举例详解
什么是贪心算法其实我个人觉得贪心算法还是很好理解的,起码比KMP好理解多了。。。。1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优 (即最有利)的选择,从而希望能够导致结果是最好或者最优的算法2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果贪心算法的应用-集合覆盖可能介绍了贪心算法的定义,大家不是...
2020-02-21 22:37:48 1465
原创 动态规划算法解决背包问题
什么是动态规划算法1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 (即下一个子阶段的求解...
2020-02-21 13:11:02 4578
原创 分治算法思想及经典案例
分治算法介绍1)分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……2)分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并...
2020-02-20 22:03:27 2976 2
原创 图的小结及深度优先和广度优先遍历
什么是图前面我们学了线性表和树,线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点,当我们需要表示多对多的关系时,这里我们就用到了图。图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。如图图的常用概念1)顶点(vertex):顶点就是图的每一个点2)边(edge):两个顶点若能相连,连的线就是一个边3)路...
2020-02-20 21:15:39 1763 1
原创 平衡二叉树(AVL)的左旋转右旋转和双旋转
平衡二叉树的介绍首先,咱们先来说一下为什么要提出平衡二叉树的概念,如果一个二叉排序树是一个只有左子树或者右子树的二叉排序树的时候,其实它就相当于一个链表,但是他的查询,删除,遍历的速度却没有链表快。这是为什么呢。因为在每次查询,删除,遍历的时候,要去判断他的左节点或者右节点是否为null,所以浪费了时间。所以我们提出平衡二叉树的概念基本介绍1)平衡二叉树也叫平衡二叉搜索树(Self-bala...
2020-02-19 14:12:42 2125 3
原创 二叉排序树(节点的添加-遍历-删除)
二叉排序树的简介二叉排序树:BST: (Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点比如针对据 (7, 3, 10, 12, 5, 1, 9),对应的二叉排序树为:二叉排序树创建和遍历一个数组创建成对应的二叉排序树,并...
2020-02-19 13:46:55 335 1
原创 赫夫曼树小结
赫夫曼树的介绍给定n个权值作为 n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree),还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近赫夫曼树几个重要概念1)路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长...
2020-02-17 14:28:48 198 1
原创 排序算法小结6——堆排序(详细图解)
什么是堆堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 :没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆图示小顶堆图示:堆排序的基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。...
2020-02-17 13:29:14 786 1
原创 二叉树小结
什么是树在了解二叉树之前我们先来认识一下什么是树。树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树;它是一种插入数据效率比链表高,...
2020-02-15 21:12:52 213
原创 斐波那契查找(黄金分割法)超详细详解
斐波那契查找思路说句实在话,这个斐波那契查找我看了不下5遍才理解他的思路和代码,因为它里面的值太多,不好理解容易绕晕,所以我给大家用自己的理解讲一下什么是斐波那契要想学会斐波那契查找,首先你得知道什么是斐波那契数列斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、····,在数学上,斐波那契被递归方法如下定义:F(1)=1,F(2)=1,F(n)=f(...
2020-02-15 00:48:56 12598 14
原创 插值查找算法详解
插值查找思路其实说实话,插值查找和二分查找区别并不大,唯一的区别就在于插值查找的中间值不再是(left+right)/2,因为这样定义的中间值可以说与我们的目标值真的毫无关系,查找起来效率太低,而插值查找却是将中间值。。。咳咳,这时候不应该叫中间值,叫划分序列的值,插值查找却是将划分序列的值经过一个数学公式和目标值自适应起来,虽然我并不理解这个公式的原理,,,,下面直接上图将它改完后,剩余...
2020-02-15 00:16:14 905 1
原创 二分查找算法详解及优化
二分查找算法的思路在进行二分查找之前我们首先要明确一点,那就是要想使用二分查找,给的必须是一个有序序列,否则此方法无效二分查找的思路其实很简单,就是将给定的序列从中间数分成两份,左边这一份都比中间数小,右边这一份都比中间数大,然后我们将要找的值和这个中间值比较大小,如果目标值比中间值大,说明目标值在右边这一份里,这时我们只需将右边这一份当作一个新的有序数组,再从其中间值分成两份,然后继续比较(...
2020-02-15 00:01:24 1010
原创 常用排序算法的时间复杂度和稳定性
如题,见图名词解释:1)稳定:如果 a原本在 b前面,而 a=b,排序之后 a仍然在 b的前面;2)不稳定:如果 a原本在 b的前面,而 a=b,排序之后 a可能会出现在 b的后面;3)内排序:所有排序操作都在内存中完成;4)外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;5)时间复杂度:一个算法执行所耗费的时间。6)空间复杂...
2020-02-14 14:48:28 1159
原创 排序算法小结5——基数排序(桶排序)
1.基数排序(桶排序)介绍:1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法3)基数排序(Radix Sort)是桶排序的...
2020-02-14 13:20:32 323
原创 排序算法小结4——归并排序
归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序算法的思路及过程过程:将原数组从中间分开,以中间的数为区分,分为左边的数组和右边的数组,然后通过递归将左...
2020-02-13 13:22:35 198
原创 排序算法小结3——快速排序
快速排序的介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列快速排序的思路图快速排序的过程和思路其实很简单,假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个...
2020-02-13 13:06:00 226 1
原创 排序算法小结2(插入排序和希尔排序)
1插入排序法1.1插入排序法的介绍插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。1.2插入排序法思想插入排序(Insertion Sorting)的基本思想是:把 n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有 n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排...
2020-02-12 15:06:48 193
原创 排序算法小结1(冒泡排序和选择排序)
1.冒泡排序的介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。1.1演示冒泡过程的例子(图解)小结上面的图解过程:(1)一共进行数组的大小-1 次大的循环(2)每一趟排序的次数在逐渐的减少(3)如果我们发现在某趟排序中,没...
2020-02-10 23:50:24 333
原创 算法的时间复杂度
1.度量一个程序(算法)执行时间的两种方法1)事后统计的方法这种方法可行,但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。2)事前估算的方法通过分析某个算法的时间复杂度来判断哪个算法更优。2.时间频度时间频度:一个算法花费的时间与算法...
2020-02-10 23:34:01 1227
原创 leetcode172,阶乘后的零
题目介绍给定一个整数 n,返回 n! 结果尾数中零的数量。示例 1:输入: 3输出: 0解释: 3! = 6, 尾数中没有零。示例 2:输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零.思路分析看到这个题目我脑子里立马就想到递归求阶乘然后mod10,让计数变量++,再取下一位,但是做了之后我发现,很遗憾,溢出了(我早该想到没这么简单)于是乎我看了一下别人的思...
2020-02-10 13:03:45 260
原创 递归回溯解决八皇后问题(单数组)
问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。思路分析1)第一个皇后先放第一行第一列2)第二个皇后放在第二行第一列、然后判断是否 OK,如果不 OK,继续放在第二列、第三列、依次把所...
2020-02-10 10:31:53 547
原创 递归回溯解决迷宫问题
一、问题介绍有一个迷宫地图,有一些可达的位置,也有一些不可达的位置(障碍、墙壁、边界)。从一个位置到下一个位置只能通过向上(或者向右、或者向下、或者向左)走一步来实现,从起点出发,如何找到一条到达终点的通路。二、思路分析用二维矩阵来模拟迷宫地图,1代表该位置不可达,0代表该位置可达。然后我们制定一个走迷宫的策略(比如先向哪走)每走过一个位置就将地图的对应位置标记为2,以免重复。找到通路后打...
2020-02-09 21:24:20 372
原创 递归的基本概念
1.递归的概念简单的说:递归就是方法自己调用自己 ,每次调用时传入不同的变量 .递归有助于编程者解决复杂的问题 ,同时可以让代码变得简洁。(个人觉得递归很类似于循环)2.递归调用机制我列举个递归的经典案例——,来帮助大家理解递归打印案例:问题:给你一个正整数n,让你计算出n的阶乘代码如下:public static int factorial(int n) { if...
2020-02-08 23:29:40 3829
原创 leetcode204计数质数——厄拉多塞筛法求质数的个数
今天在leetcode上做了一道题,就是204题,题目是这样的统计所有小于非负整数 n 的质数的数量。示例:输入: 10,输出: 4。解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。在我以往的印象里,遇到求质数的个数,我总是一个双重for循环然后找出范围内的所有质数,然后再求个数,今天我学了一种新的求质数个数的方法,方法名如题。下来我来详细讲解下这个方法。思路分析首...
2020-02-07 00:06:59 269
原创 约瑟夫环问题
最近刚学完环形单向链表,并用来解决了算法中的经典问题-——约瑟夫环问题,下面来对环形单向链表及其解决约瑟夫环问题的一些要点做一个小结1.单项环形链表的简介单向环形链表和单链表大体基本相似,他的不同就在于他是首尾相连的单链表,也就是说它是将单链表的最后一个节点的next指向了第一个节点或者头节点,(ps:如果不清楚什么是单链表请参考我的上一篇博客)如图所示:2.约瑟夫问题Josephu问题...
2020-02-06 00:29:32 1608 1
原创 java单链表的增删改查
说在前面:过年这几天想学习却静不下心,一个单链表看了5天,,,咳咳,好了,现在来总结下但单链表的一些简单的东西1.什么是链表链表是有序的列表,但是他在内存中的存储和列表并不一样,如图链表是以节点的方式来存储数据的,是链式存储,他的每个节点分为两部分,data域和next指针域,data域是用来保存该节点的数据,next域用来指向下一个节点,所以链表中的各个节点并不一定是连续存储的。逻辑示...
2020-01-28 21:40:57 459
原创 队列和环形队列
1.什么是队列队列是我们平时生活中比较常见的一种数据结构,比如银行的叫号排队就是一个典型的队列,或者我们更常见的食堂排队打饭,等等等等a.队列是一个有序列表,可以是数组或者链表来实现b.队列遵循先进先出的原则,即现存入队列的数据要先取出,后存入队列的数据要后取出2.数组模拟队列的思路队列本身是有序列表,若使用数组结构来存储队列的数据,则队列数组的声明如下图,其中maxsize是该队列的...
2020-01-13 19:40:46 394
原创 线程的生命周期(图解)
面试题关于线程方面的问题想必是面试时经常被问到的,所以我们来整理下关于线程的生命周期中的一些知识线程的生命周期1.新建 新建即创建线程对象,用关键字new创建一个线程对象时,线程处于新建状态2.就绪 线程对象调用start()方法时,该线程处于就绪状态,此时的线程有执行资格但是却没有执行权3.运行如果CPU是单核,则在任一时刻都只有一个线程在执行。当线程数据大于核 数...
2019-12-20 10:43:13 996 1
原创 Java中throw和throws的区别
throw和throws作为Java中两种异常抛出关键字,虽然两个长的很像,但是却有着很大的区别。区别1: throws: 跟在方法声明后面,后面跟的是异常类名 throw: 用在方法体内,后面跟的是异常类对象名 public static void method() throws ArithmeticException {// 跟在方法声明后面,后面跟的是异常...
2019-11-29 11:11:58 33732 9
原创 Java实现模拟斗地主发牌
分析1.创建一个HashMap集合(因为牌的编号和牌的内容是一对键值对,所以用HashMap集合)2.创建一个ArrayList集合(将每一张牌所对应的编号存储起来,作为HashMap键值对里面的键)3.创建牌(包括花色,点数)和编号(index)4.从0开始向ArrayList里面存储编号,并存储对应的牌,同时向ArrayList里存储编号5.洗牌(洗牌时洗的是编号)6.发牌(发牌...
2019-11-27 18:22:15 821
原创 Java接口,抽象类,多态小结
今天学完了Java接口,抽象类,多态,再次做一下小结1.final关键字final代表最终的意思,它可以修饰变量,方法,甚至是类。特点:(1)被final修饰的类不能被继承(2)被final修饰的变量是常量(3)被final修饰的方法不能被重写(4)final修饰基本类型的局部变量时,它的值不能被改变(即第二个特点)(5)final修饰引用类型的局部变量时,它的地址值不能被改变,但...
2019-10-11 09:17:16 230
原创 Java中接口的一些特点
1.如何创建一个Java接口我们使用interface关键词来创建一个接口interface inter{} //创建了一个接口2.接口中成员变量的特点我们先来创建一个接口并测试它interface inter{public int num=10;public final int num=30;}class interImpl implements inter{}...
2019-10-05 12:47:55 779
原创 JavaScript正则表达式(1)
今天学习了JavaScript的正则表达式,知识点有些多,在此写一遍加深印象,并与大家分享,以下全是个人理解,欢迎大家指正。正则表达式的作用及意义· 正则表达式主要对字符串定义一个规则并让计算机根据这个规则来对字符串进行操作,如:检查字符串其中的字符,替换其中字符,查找字符,分割字符等,应用在如再让用户输入邮箱或者电话号码时,用户提供了非法输入,如不予以正则表达式进行判读,则会将错误的...
2019-05-28 00:08:12 113
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人