![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法背诵
文章平均质量分 53
渎神者之刃
一个想要进步的码农
展开
-
你真的懂排序算法吗?带你理解数论中排序本质,为什么希尔排序效率竟然如此之高?
关于排序,我们从冒泡讲起:首先,我们写一个最简单的插入排序,这个是最最基础,也是所有人看到排序问题最直接的想法//直接插入排序函数void InsertSort(int a[], int n){ for(int i= 1; i<n; i++){ if(a[i] < a[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。 int j= i-1; int x = a原创 2021-04-22 11:41:50 · 750 阅读 · 3 评论 -
认真背算法day05
今天写一下回溯算法。关于回溯算法,我认为回溯本质而言就是一个递归(一个深度遍历DFS),只不过这个递归过程看好是遇到不合适的就往回走,然后继续遍历。那么如何选取到最合适的解决方案呢,那就是在遍历的过程中加入一个“记事本”,这个记事本用来记录当前已经拿到的最好的结果,在后续的遍历过程中,如果有更好的结果,就把当前结果进行替换。但是递归的复杂度太高了,有没有什么好的解决办法呢,就是加上剪枝过程,根据实际题目条件加上限制用来剪枝,让不必要的遍历直接跳过。一个典型的背包问题0-1问题,就是可以用回溯来解原创 2021-03-16 18:48:26 · 105 阅读 · 0 评论 -
认真背算法day04
好久没更新算法了,今天再更新一天。今天主要复习一下trie树和ac自动机1.trie树Trie 树,是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。trie树的记录方法:每一个节点,都记录其所有可能出现的字符,以一个数组形式组织,数组中存放节点。具体组织形式如下:public class Trie { private TrieNode root = new TrieNode('/'); // 存储无意义字符 // 往Tr.原创 2021-03-15 18:41:48 · 106 阅读 · 0 评论 -
认真背算法day03
昨天高强度背了BM算法和KMP算法,今天整点阳间的休闲一下。今天主要讲两个东西,一个是堆排序,一个是图的深度遍历(回溯算法)和广度遍历。堆排序为什么堆这么重要呢?因为堆是可以用数组表示的,假设堆上某个节点在数组中下标为i,则其左右孩子节点的下标为i*2和i*2+1。下面讲解堆排序的思路:我看过网上很多文章,我认为他们都没有讲清楚堆排序,其实堆排序就一个很重要的操作,叫做堆化(heapify)堆化其实本质是说这样一件事:假如有一个完全二叉树,它的根节点的左右子树都是堆,那么经过堆化,这原创 2021-03-10 20:23:23 · 78 阅读 · 0 评论 -
认真背算法day02(续)--kmp算法
字符串匹配怎么能少了大名鼎鼎的kmp算法呢?概念:好前缀:直到遇到坏字符为止,最长的前缀子串。好前缀的所有后缀子串中,最长的可匹配前缀子串的那个后缀子串,叫作最长可匹配后缀子串;对应的前缀子串,叫作最长可匹配前缀子串直接上思路:1.KMP算法和bm算法完全相反,kmp算法采用从前到后进行比较。2.kmp算法主要是为了找:最长可匹配后缀子串(最长可匹配前缀子串)。3.KMP 算法也可以提前构建一个数组,用来存储模式串中每个前缀(这些前缀都有可能是好前缀)的最长可匹配前缀子串的.原创 2021-03-09 23:51:10 · 107 阅读 · 0 评论 -
认真背算法day02--字符串比较(使用java)
字符串的几个经典算法可以说都是很令人头疼的,下面主要背四个1.暴力解法这个就不讲解了,因为实在太暴力了,代码也很简单。但是这里要讲几个重要概念:主串和模式串:比方说,我们在字符串 A 中查找字符串 B,那字符串 A 就是主串,字符串 B 就是模式串。我们把主串的长度记作 n,模式串的长度记作 m。因为我们是在主串中查找模式串,所以 n>m。后缀字串和前缀子串:字符串“abcdefg”,后缀字串为:“g”,"fg","efg"等等;前缀子串为:"a","ab","abc"等等。原创 2021-03-09 22:29:46 · 102 阅读 · 0 评论 -
认真背算法Day01
有些算法是一定要背下来的,为了方便背诵,总结了每种算法的要点。1.排序这里主要讲解归并排序和快速排序,为什么主要讲这两个呢,因为这两的时间复杂度都是o(nlogn),其次他们都是采用了递归的思想。为了背下来这两个算法,就需要深刻理解递归。所有的递归问题,本质都可以分为三点:1.一个大问题,可以分解为若干有限个小问题;2.这些被分解出来的小问题,除了在数据规模上低于大问题,问题内容和解决思路完全和大问题一致;3.存在递归终止条件,不然会爆栈。1.1归并排序思想:归并排...原创 2021-03-08 22:08:09 · 170 阅读 · 0 评论