
算法
WolfOnTheWay
我们的目标就是做大,做强,定创辉煌!
展开
-
分治算法详解+相关面试题总结(C++版)
分治算法的思想分治算法的思想就是原问题可以转换成问题更小的子问题,并且子问题的求解方法和原问题相同,只是规模不同。因此我们就可以将原问题层层分解成小问题,直至小问题能够直接进行求解。然后对小规模的问题进行求解,然后将求得的解层层向上合并,合并成原问题的解。分治法的步骤如下:第一步 分: 将原来复杂的问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题,分解到可以直接求解为止。第二步 治: 此时可以直接求解。第三步 合: 将小规模的问题的解合并为一个更大规模的问题的解,自底向上 逐原创 2020-07-01 16:25:27 · 520 阅读 · 0 评论 -
分治法求数组中的众数
先说一下题目吧,很简单,就是给一组数组,求数组中的众数,但是要用分治法。看到这个题目还是比较迷的,求一个众数,用什么分治啊。最后参考了一下往上的各种答案,发现可以用快排的分割算法,思路如下:首先是要运用快排的分割算法,设函数名为quick,重复次数设置为n,众数设为mode,数组长度即为length.选取中间的值作为基准值来进行快排分割,这样做可以尽量去避免重复的计算。 记k为快排分割的返回值,即为基准值的最终位置,同时在进行快排分割函数的时候需要记录基准值的重复次数,如果大于n,那么将mod原创 2020-07-01 15:22:02 · 1891 阅读 · 0 评论 -
线性时间选择(分治):找出一组数中的第k小元素||C++
问题是这样的,有一组数据,请找出这组数据中的第k小的元素。这个问题为什么叫线性时间选择,我至今没有弄清楚,忘大家能给解释以下。我在这里给出上述问题的代码:这里利用的是快排的分割算法。是采用分治法的思想,即将问题划分规模更小的子问题。代码如下:#include<iostream>using namespace std;int quick(int* arr, int start, int end){ int low = start; int high = end;原创 2020-05-28 22:28:07 · 1132 阅读 · 0 评论 -
有两个大小都为n升序的int数组。查询第n小的数值(分治)||C++实现
这道题和leetcode上的第 4到算法题非常类似。这道题我们采用二分法(分治)的方式来进行解决。思路如下(这里参考leetcode中的官方解析):假设两个有序的数组A和B。要找到第k个元素,我们可以比较A[k/2-1]和B[k/2-1]。由于A[k/2-1]和B[k/2-1]前面分别有k/2-1个元素(从0开始记),那么对于A[k/2-1]和B[k/2-1]中的最小者,前面最多会有(k/2-1)+(k/2-1)<=k/2-2个元素比它小,那么它就不可能是第k小的数。因此我们可以归纳出三种原创 2020-05-27 22:27:10 · 418 阅读 · 0 评论 -
二分查找算法(分治)||C++实现
二分查找算法是查找算法里面非常简单的一个,这里给出二分查找算法的递归和非递归的代码。原创 2020-05-27 18:48:44 · 529 阅读 · 0 评论 -
八大排序详解||冒泡排序||选择排序||插入排序||shell(希尔排序)||快速排序(多种优化)||堆排序||归并排序||基数排序(桶排序)||效率总结
目录1.冒泡排序2.选择排序3.直接插入排序4.shell排序5.快速排序5.1递归版本5.2栈版本5.3随机选取基准法5.4三分取中法5.5少量元素直接插入法5.6聚集相同元素法6.堆排序7.归并排序8.基数排序9.时间复杂度、空间复杂度、稳定性总结这篇文章的大多图片来自网上一些大神的分享,在此感谢!!1.冒泡排序思路:依次...原创 2020-03-25 17:19:06 · 445 阅读 · 0 评论 -
BoyerMoore算法详解(理解不了你打死我)|代码实现(c++)
目录1.BoyerMoore算法1.1坏字符规则:1.2好后缀规则1.3一个例子2.代码实现1.BoyerMoore算法BoyerMoore算法和KMP、BF算法一样,是一种字符串匹配的算法,不过它的效率比KMP算法更为高效(3~5倍)。我们先来简单介绍一下BF算法的几个规则(特点)首先,将模式串和目标串(要进行查找的串)左端对齐,从右端开始比较。 当比...原创 2020-03-22 16:48:05 · 2869 阅读 · 5 评论 -
查重和topK问题的结合|10G文件按,内存不够|多文件操作|c++STL
查重问题和topk问题的结合是面面试中非常容易问到的一道题。假如有10G的数据,内存只有4G甚至更小,要求求出重复率最高的前K个数,我们该怎么办呢。我们不妨将大文件分成若干个小文件,然后利用map和priority_queue求出重复率最高的数字。在这里我们要注意一点,在大文件分成小文件的时候,我们可以用当前的数据取模来确定它分在哪个文件之中。比如:我们要将大文件分成10个小文...原创 2020-03-20 11:14:00 · 737 阅读 · 0 评论 -
逆波兰表达式的求解代码(前缀和后缀表达式,括号匹配问题)
1.前缀、中缀和后缀表达式如果大家对这些表达式还不知道的话,可以参考资料2.逆波兰(后缀)表达式求解在这里我们以LeetCode上的一道面试题为例,题目描述如下图:解题思路很明确,在求解后缀表达式的时候,我们可以选用栈这种结构,遇到数字入栈,遇到符号连续出栈两次,并将运算结果入栈。接下来看下代码是如何实现的。# include<iostream>using ...原创 2020-03-13 15:39:32 · 496 阅读 · 0 评论 -
KMP算法还可以这样改进?KMP算法的改进
目录KMP算法的改进点nextval数组的手动求解nextval数组的程序求解KMP算法的改进点在原始的KMP算法中,子串已经不会回退到起始点,但是还有一种特殊情况,首先看下表(已经求得next数组)。模式串 A A A A A B j 0 1 2 3 4 5 next[j] -1...原创 2019-12-11 18:06:05 · 524 阅读 · 0 评论 -
BF算法
BF算法是普通的模式匹配算法,算法思想是将目标串的第一个字符与模式串的第一个字符进行比较,若相等,则继续比较目标串和模式串的第二个字符,若不相等,则比较模式串的第二个字符和目标串的第一个字符,一次比较下去,直到得出最后的匹配结果,BF算法是一种蛮力的算法。int BF(char *str,char *sub,int pos){ assert(str!=NULL&&sub!=N...原创 2019-02-01 15:38:12 · 382 阅读 · 0 评论 -
KMP算法
KMP算法相对于BF算法,KMP算法更为高效。原因在于BF算法的时间复杂度为O(mn),m代表主串的长度,n代表字串的长度。而KMP算法的时间复杂度为O(m+n)。KMP算法的精髓就在于当某一次匹配失败之后,指向主串的迭代器不会回退,指向字串的迭代器会回退到某一特定的位置。int KMP(const char *str,const char *sub,int pos,int *next){...原创 2019-02-01 21:54:22 · 428 阅读 · 0 评论