算法
文章平均质量分 86
珞沫
欲望以提升热忱,毅力以磨平高山。
展开
-
『算法』——回溯算法
回溯算法原创 2021-02-14 09:26:18 · 627 阅读 · 0 评论 -
『算法』——递归算法
递归算法1、递归的概念2、递归的特点3、递归过程3.1 “递”3.2 “归”1、递归的概念递归,顾名思义,有递有归才叫递归。若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。说白了,递归就是一个函数:在函数中,调用函数自身,我们把这样的函数叫做递归函数。2、递归的特点递归的基本思想是"自己调用自己”适合用递归方法求解的场景:有一个初始状态后续的情况可以由前面的状态推出例原创 2021-02-06 13:54:43 · 957 阅读 · 1 评论 -
『算法』——字符串模式匹配算法3【BM算法】
BM算法1、概述2、原理2.1 坏字符规则2.2 好后缀规则3、代码实现3.1 坏字符3.2 好后缀3.31、概述\quad \quadBM(Boyer-Moore) 算法,是一种非常高效的字符串匹配算法。据实验统计,它的性能是著名的 KMP 算法的 3 到 4 倍。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法2、原理2.1 坏字符规则\quad \quad“坏字符” 是什么意思?就是指模式串和子串当中不匹配的字符。还以上面的字符串为例,当模式串和主串的第一原创 2021-01-11 12:13:34 · 715 阅读 · 0 评论 -
『算法』——字符串模式匹配算法2【KMP算法】
KMP算法引言1、概述2、基本思想3、KMP算法——next数组引言\quad \quad上一篇讲了BF算法,但是其时间性能比较低?在每趟匹配不成功时存在大量回溯,没有很好的利用部分匹配成功的结果。比如,匹配不成功时,主串必须回溯到下一个字符,模式串回溯到0,开始一一重新匹配。那有没有可能主串不回溯,模式串移动呢?就有了KMP算法1、概述\quad \quadKMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫原创 2021-01-11 09:32:04 · 421 阅读 · 2 评论 -
『算法』——字符串模式匹配算法1【BF算法】
BF算法引言1、基本思想2、伪代码3、代码实现引言字符串模式匹配:\quad \quad设 S 和 T 是给定的两个串,在主串 S 中找到模式串 T 的过程称为字符串匹配,如果在主串 S 中找到模式串 T ,则称匹配成功,函数返回 T 在 S 中首次出现的位置,否则匹配不成功,返回 -1。例:在上图中,我们试图找到模式串 T = baab,在主串 S = abcabaabcabac 中第一次出现的位置,即为红色阴影部分, T 第一次在 S 中出现的位置下标为 4 ( 字符串的首位下标是 0 )原创 2021-01-10 21:10:44 · 1378 阅读 · 0 评论 -
『算法』——双指针算法——快慢指针/对撞指针/滑动窗口(快慢指针的一种)
双指针算法引言1、对撞指针2、快慢指针3、滑动窗口引言什么是双指针?\quad \quad严格的来说,双指针只能说是是算法中的一种技巧。双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。\quad \quad双指针算法在一些数组题中很常用,双指针算法有两种形式,一种被称为对撞指针,两个指针从两端向中间靠拢;另一种是快慢指针,两个指针向统一方向运动,滑动窗口方法就是一种常用的快慢指针方法。快慢原创 2020-09-21 12:09:58 · 1229 阅读 · 2 评论 -
『算法』——Python之快速排序算法(单路快排、双路快排、三路快排)
快速排序1、单路快排1.1 普通单路快排1.2 随机单路快排2、双路快排3、三路快排1、单路快排\quad \quad单路快排即快速排序。\quad \quad快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。1.1 普通单路快排基本思想:1): 从序列中挑出一个元素作为"基准"元素,一般是该序列的第一个元素或者是最后一个元素。2): 把序列分成2个部分,其数值大于"基准"元素的元素放在"基准"元素的左边,否在原创 2020-09-17 18:25:57 · 1597 阅读 · 1 评论 -
位运算各种方法总结
位运算1、按位与2、按位或3、按位取反4、按位异或5、按位同或6、左移7、带符号右移8、无符号右移9、python实现各种位运算操作\quad \quad现代计算机中,几乎都是二进制计算机(三进制计算机仅有少量),所有的数据都以二进制的形式存储在设备中。位运算就是直接对整数在内存中的二进制位进行操作。\quad \quad需要注意,位运算是针对 二进制 的运算,对每一个位进行布尔运算操作。所以 手动 进行 位运算计算 时,需要将数转换成二进制的表示形式,再进行计算。1、按位与\quad \quad只原创 2020-09-16 17:09:28 · 6886 阅读 · 0 评论 -
『算法』——贪心算法
贪心算法原创 2020-09-11 15:58:05 · 620 阅读 · 0 评论 -
『算法』——动态规划算法
动态规划1、概述1、概述\quad \quad动态规划( dynamic programming )算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强。利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题。...原创 2020-09-04 16:04:35 · 820 阅读 · 0 评论 -
『算法』——分治算法(python实战)
分治算法1、思想2、适用条件3、算法实现基本步骤4、复杂性分析5、应用6、实践1、思想\quad \quad分治算法的核心思想就是四个字,分而治之。也就是将要求解的较大规模的问题分割成K个更小规模并且结构与原问题相似的子问题;对这K个问题分别求解。如果子问题的规模仍然不够小,则再划分为K个子问题,如此递归地进行下去,直到问题规模足够小,很容易求出其解为止。将求出的小规模的问题的解合并为一个更大规模的问题的解,自底而上逐步求出原来问题的解。 2、适用条件\quad \quad分治法所能解决原创 2020-09-01 21:10:25 · 1887 阅读 · 0 评论 -
『算法』——斐波那契查找算法(python实现)
斐波那契查找引言1、概述2、原理引言\quad \quad在介绍斐波那契查找算法之前,先介绍一下很它紧密相连的一个概念——黄金分割。黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。0.618被公认为最具有审美意义的比例数字,这个数值的作用不仅仅体现在诸如绘画、雕塑、音乐、建筑等艺术领域,而且在管理、工程设计等方面也有着不可忽视的作用。因此被称为黄金分割。斐波那契数列:1, 1, 2, 3,原创 2020-08-26 20:43:46 · 1420 阅读 · 0 评论 -
『算法』——静态查找——插值查找(python实现)
插值查找1、概述2、原理3、算法4、特点1、概述\quad \quad以查字典为例,在英文字典中查 “apple” 时,下意识的会翻开前面的书页,当查 “zoo” 时,下意识的翻开一定是后面的书页,显然,此时还绝对不是从中间开始查起,而且有一定目的地从前或从后查找。\quad \quad同样的,以取值范围在 1~10000 间的 100 个元素从小到大均匀分布的数组中查找 5,那么自然会考虑从数组下标较小的开始查找。\quad \quad可以看出,二分查找这种查找方式,并不是自适应的,因此,基于二分原创 2020-08-26 15:43:09 · 578 阅读 · 0 评论 -
图文详解—十大经典排序算法
十大经典排序算法排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。排序算法平均时间复杂度最好情况最坏情况空间复杂度排序方法稳定性冒泡排序Θ(n2)\The...原创 2020-04-08 11:57:26 · 2901 阅读 · 1 评论 -
『算法』——静态查找——线性表查找——分块查找
分块查找1、概述2、思想3、算法流程4、效率分析特点1、概述\quad \quad分块查找,又称索引顺序表的查找,它是顺序查找的一种改进方法,要求按块有序,块内无序。2、思想\quad \quad将n个数据元素“按块有序”划分为m块(m≤n)(m\leq n)(m≤n)。每一块中的元素不必有序,但块与块之间必须“按块有序”;即第一块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素的关键字又都必须小于第3块中任一元素的关键字,…3、算法流程step1 将表分成几块,且表或者原创 2020-08-26 14:20:06 · 480 阅读 · 0 评论 -
『算法』——静态查找——线性表查找——线性查找(顺序查找)
线性查找引言1、线性查找2、哨兵线性查找3、效率分析4、特点引言线性查找是顺序表或线性链表表示的静态查找表表内元素无序1、线性查找\quad \quad从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。【伪代码】——迭代法def linear_search(A,x): n=len(A) answer = "NOT FOUND" for i原创 2020-08-25 16:03:54 · 635 阅读 · 0 评论 -
『算法』——查找概述
查找1、定义2、常用操作3、分类4、查找算法的评价指标5、查找方法1、定义\quad \quad查找表:同一类型元素或记录构成的集合。由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。\quad \quad查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录。2、常用操作\quad \quad对查找表的常用操作:1)查找某个元素是否在表中;2)检查某个元素的各个属性;3)插入一个新数据元素;4)删除某个数据元素。3、分类\quad \原创 2020-08-25 11:17:56 · 388 阅读 · 0 评论 -
『算法』——静态查找——线性表查找——二分查找(折半查找/对分查找)
二分查找二分查找法只适用于从有序的队列中进行查找(比如数字和字母等),将队列排序后再进行查找。基本思想:假设表中元素是有序的,将表的中间位置的关键字与所需的关键字比较,相等则成功,否则分为前后两个子表,若所需的值大于中间元素,则在后半部分查找,否则在前半部分查找。不断重复这个过程,直到查找成功。否则查找失败。需要两个指针p,r优点:比较次数少,速度快缺点:要求待查表为有序表。时间复杂度:O(logn)伪代码python:#非递归实现import numpy as npdef bina原创 2020-05-16 11:54:26 · 824 阅读 · 0 评论 -
『算法』-时间复杂度与空间复杂度
时间复杂度与空间复杂度渐近记号时间复杂度空间复杂度渐近记号使用渐近记号的函数刻画算法的运行时间。渐近记号包括:(1)Θ(theta):相当于"=",给出函数大的渐近上界和下界。(2)O(大欧):相当于"<=",给出函数的渐近上界(3)o(小欧):相当于"<",给出函数的非渐近紧确上界(4)Ω(大omega):相当于">=",给出函数的渐近下界(5)ω(小omega...原创 2020-04-16 12:05:01 · 644 阅读 · 0 评论