算法
学习算法,是学习一种思维
理科男同学
路漫漫其修远兮,吾将上下而求索!
展开
-
字符串匹配KMP算法
1,什么是字符串匹配假设现在随机输入一个长度为m的主串T,另外输入一个长度为n(n≤m)的字符串P,我们来判断字符串P是否是主串T的一个子串(即能否从T中随机取出与P同长的一段字符串,与P完全匹配)。这就是字符串问题的简单描述。1.1,蛮力法匹配蛮力法的思想:假设我们把子串和主串从第一个位置开始逐个字符进行匹配,如果相匹配的字符发现相等,也就是P[i]=T[j],那么我们就另i++,j++,逐个字符向后面进行匹配,但是如果P[i]!=T[j]的话,我们就重新设置j=0,i=i-j+1,重新开始匹原创 2020-12-07 11:23:04 · 497 阅读 · 1 评论 -
最短寻道时间优先算法(SSTF)&&扫描算法(SCAN)
最短寻道时间优先算法(SSTF)SSTF问题描述:SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但是能提供比FCFS算法更好的性能。这种算法会产生“饥饿”现象。 1、算法思想:优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。 2、优点:改善了磁盘平均服务时间。 3、缺点:...原创 2018-10-19 16:04:52 · 53206 阅读 · 0 评论 -
剑指Offer算法索引
数组元素去重原创 2020-12-05 20:30:02 · 144 阅读 · 0 评论 -
剑指Offer-数组去重
1,查找数组中的重复数字题目描述:1.1,思路一这个题目是一道简单题目,最容易想到的是对数组中的元素一趟排序操作,然后在扫描一趟数组,就可以查找出重复的元素。但是这样的话排序是这里面最耗时间的地方,排序一个长度为n的数组的时间复杂度是o(nlogn)。代码实现:/** * 排序方法查找数组中的重复元素 * @param arr 待排序数组 * @return 查找到重复元素就返回,否则返回-1 */ public static int dupli原创 2020-12-05 20:28:22 · 220 阅读 · 0 评论 -
数据结构-平衡二叉树(AVL树)
目录1,平衡二叉树的介绍1.1,二叉排序树存在的问题1.2,平衡二叉树1.3,平衡二叉树的创建1.4,平衡二叉树的查找2,代码实现2.1,平衡二叉树的节点类型2.2,LL旋转(单右旋转)2.3,RR旋转(单左旋转)2.4,向avl树中添加一个节点2.5,求左右子树的高度2.6,求平衡二叉树的高度2.7,中序遍历二叉树2.8,创建一颗平衡二叉树3,测试代码1,平衡二叉树的介绍1.1,二叉排序树存在的问题在介绍平衡二叉树之前,我们先来看看.原创 2020-11-15 15:13:00 · 2492 阅读 · 1 评论 -
数据结构-红黑树原理
目录1,R-B-Tree的简介1.1,红黑树的特性2,红黑树的基本操作(一) 左旋和右旋和变色2.1,红黑树的基本操作(二) 添加2.2,红黑树的基本操作(三) 删除2.2.1,删除小结2.2.2,删除案例1,R-B-Tree的简介R-B Tree,全称是Red-Black Tree,又称为“红黑树”,红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树本质上是一种二叉查找树,但它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有原创 2020-11-15 11:05:55 · 364 阅读 · 0 评论 -
数据结构-二叉树(一 链式存储)(Java版)
目录1,二叉树的介绍1.1,树的定义1.2,概念解释2,二叉树2.1,二叉树的特点2.2,二叉树的性质2.3,斜树2.4,满二叉树2.5,完全二叉树3,二叉树的实现3.1,二叉树的节点类型3.2,二叉树遍历操作(递归实现)3.2.1,前序遍历递归实现3.2.2,中序遍历递归实现3.2.3,后序遍历递归实现3.3,二叉树的遍历操作(非递归实现)3.3.1,前序遍历非递归实现3.3.2,中序遍历非递归实现3.3.3,后序遍历非递归实现.原创 2020-11-07 11:37:44 · 393 阅读 · 0 评论 -
数据结构-查找算法(Java版)
目录1,查找算法概述1.1,查找算法的分类1.2,查找的性能衡量指标-平均查找长度(Average Search Length,ASL)1.3,查找性能2,查找算法实现2.1,顺序查找2.1.1,顺序查找复杂度分析2.1.2,代码实现2.2,二分查找算法2.2.1,复杂度分析2.2.2,二分查找代码实现2.2.3,算法改进2.3,插值查找算法2.3.1,代码实现2.4,斐波那契(黄金分割法)查找算法2.4.1,斐波那锲查找算法原理2.4..原创 2020-11-06 21:52:29 · 447 阅读 · 0 评论 -
数据结构-哈希表(Java版)
目录1,什么是哈希表1.1,如何解决哈希碰撞问题1.2,哈希表有什么优势呢?2,链表的实现2.1,哈希表中的节点类型2.2,链表的定义2.2.1,链表的节点定义2.2.2,向链表末尾添加一个元素2.2.3,在链表中查找一个元素2.2.4,在链表中删除一个元素2.2.5,打印链表3,哈希表的实现3.1,定义一个哈希表3.2,向哈希表中添加一个元素3.3,获取元素索引3.4,哈希表的遍历3.5,在哈希表中查找一个元素3.6,在哈希表中删除一原创 2020-11-06 20:50:20 · 260 阅读 · 0 评论 -
数据结构-循环链表(三)(Java版)
目录1,什么是循环链表2,循环链表的实现2.1,循环链表节点的定义2.2,循环链表的实现2.2.1,定义一个循环链表2.2.2,向循环链表末尾添加一个元素2.2.3,打印循环链表2.2.4,根据元素值删除循环链表中的一个节点2.2.5,约瑟夫环问题的实现1,什么是循环链表循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。下面使用一张说明什么是循环链表:循环链表在逻辑上形成的是一个环,是原创 2020-11-06 20:18:33 · 253 阅读 · 0 评论 -
数据结构-双向链表(二)(Java版)
目录1,什么是双向链表?2,双向链表的实现2.1,双向链表的节点类型2.2,双向链表的实现2.2.1,定义一个双向链表2.2.2,向双向链表的末尾插入一个元素2.2.3,向双向链表的头添加一个元素2.2.4,根据索引向双向链表中任意一个位置插入一个元素2.2.5,根据元素值删除双向链表中的一个节点2.2.6,遍历双向链表1,什么是双向链表?双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针。所以在双向链表中.原创 2020-11-06 19:39:24 · 159 阅读 · 0 评论 -
数据结构-单链表(一)(Java版)
目录1,什么是单链表?2,单链表的实现2.1,单链表的节点类型2.2,单链表的实现2.2.1,定义一个单链表2.2.1,头插法插入一个节点2.2.2,采用尾插法插入一个节点2.2.3,删除单链表中的一个节点2.2.4,打印出一条单链表3,关于单链表面试题目简单练习3.1,查找单链表中第k个节点3.2,单链表的反转3.3,从尾到头打印单链表3.4,合并两个有序的单链表3.5,单链表的小结1,什么是单链表?单链表 [LinkedList]:由各原创 2020-11-06 17:44:31 · 172 阅读 · 0 评论 -
数据结构-交换排序(冒泡算法,快速排序)
1,冒泡排序思想冒泡算法是一种基于交换思想的排序算法,算法每次都和相邻的两个元素比较,把比较结果比较大的哪一个元素逐渐的交换到最后的位置,经过n-1趟比较后,整个序列有序。可以看到,冒泡算法的每一趟排序都有一个元素被放到最终的位置,下面我们通过一个例子看看冒泡排序的过程。2,冒泡排序过程分析首先看我们的原始数据,每次都把前面的一个元素和后面的一个元素比较,如果前面元素小于后面元素,不发生交换,如果前面元素大于后面元素,就发生交换,直到遍历完所有的元素,此时我们的第一趟排序完成,从结果来看,我原创 2020-10-28 12:20:38 · 779 阅读 · 0 评论 -
剑指offer(3-10)
3,数组中重复数字原创 2020-10-20 16:29:53 · 91 阅读 · 0 评论 -
数据结构-线性表(链表)(c++版)
目录1,单链表的基本概念与特点2, 单链表的特点3,单链表的结构定义及其方法的实现 3.1 单链表结构的定义3.2方法的基本实现3.3 单链表的插入删除操作讲解3.4 单链表的删除算法3.5 单链表的顺序访问与尾递归3.6 尾插法建立单链表(递归方法实现)3.7 头插法建立单链表(递归实现)3.8 非递归算法实现链表的头插法和尾插法1,...原创 2018-09-30 22:35:06 · 579 阅读 · 0 评论 -
数据结构-归并排序
1,二路归并排序设计思路与快速排序一样,归并排序也是基于分治策略的排序,(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序将待排序的元素分成两个长度相等的子序列,分别为每一个子序列排序,然后把子序列合并成一个总的序列。合并两个子序列的过程称为二路归并。(注:二路归并算法是一种稳定排序算法,他的运...原创 2018-10-19 14:51:07 · 5798 阅读 · 0 评论 -
算法分析——分治策略
1 分治策略概念分治法是讲一个复杂的问题分成两个或者更多的相同或者相似的问题,这些子问题相互独立或者形式相同,再把子问题分解成更小的子问题,一直这样循环下去,直到最后子问题可以简单的直接求解,原问题的解即子问题解得合并。例1.1给定一个顺序表,编写一个求出其最大值与最小值的分治算法。分析:假设我们的数据按顺序的存放在一个整型数组中,如果数组大小为1,那么就可以直接给出结果,如果大小...原创 2018-11-02 12:17:06 · 561 阅读 · 0 评论 -
最长公共子序列(动态规划)
目录 1 子序列概念2 问题描述2.1 问题分析:2.2 动态规划求解公式2.3 算法展示2.4 求解最长序列输出1 子序列概念一个给定序列的子序列是在序列中删除若干个元素后得到的序列。在这里,首先说明子序列的概念(切记子序列非子集的概念),例如是序列的一个子序列,则序列在序列中相对应的下标为,序列和的下标都是从1开始。2 问题描述如果给定两个序列和...原创 2018-11-16 15:36:17 · 1270 阅读 · 0 评论 -
处理机的调度
1 处理机的调度层次和调度算法目标2 批处理系统中的作业调度2.1 先来先服务调度算法(first-come first-served,FCFS)描述:FCFS是最简单的调度算法,该算法可用于作业调度,也可用于进程调度,当在作业调度中采用该算法时,系统将按照作业到达的先后次序进行调度,或者说优先考虑在系统中等待时间最长的作业,而不管作业需要执行时间的长短,从后背作业队列中选择几个...原创 2018-11-16 21:07:05 · 173 阅读 · 0 评论 -
动态规划(0-1背包问题)
1,0-1背包问题描述:给定个物品和一个背包,第个物品的重量为,其价值为.背包的总容量为,问如何选取物品使得背包中所装入物品价值最大并且装入背包物品重量之和不超过背包总重量。问题分析:需要注意的是,再把物品装入背包时,每种物品都有两种选择,装入背包和不装入背包,不可以将物品多次装入背包,也不可以只装入物品i的一部分。如果我们用来表示物品,那么当=0时表示物品没有装入背包,当!=0时...原创 2018-11-22 09:34:23 · 899 阅读 · 0 评论 -
数据结构-线性表(顺序表)(c++版)
目录1,顺序表的基本概念及特点:1.1静态存储:1.2动态存储表示2,顺序表的基本操作(动态)3,顺序表的应用演示:3.1 集合的并运算,合并集合LA与LB,结果存于LA中,重复元素只留一个。3.2 求顺序表LA与LB中公共的元素,结果存于LA中1,顺序表的基本概念及特点:1,把线性表中元素按照其逻辑顺序依次存储在一块连续的存储空间中,就得到了顺序表,它是用一维...原创 2018-09-02 15:43:34 · 265 阅读 · 0 评论