![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 79
发霉的宅大人
让世界听见中国游戏的声音!
展开
-
如何简单的理解动态规划?
个人微信公众号:程序员宅急送之前的几篇文章我讲了分治,回溯,贪心三个思想,今天我将最后一个动态规划。一、什么是动态规划?动态规划是一种类似于回溯的思想,他通过空间换时间的方法提高效率,一般用于求最优解问题。二、动态规划能解决什么类型的问题?在上面我说道,动态规划其实和回溯很类似。回溯思想在前面的文章我提到过,回溯是一种穷举可能的方法。动态规划则是通过额外的空间将回溯的递归树中不需要的可能提前剪除达到提高效率的目的。我们来回忆一下回溯能解决的问题的特征1、重复子问题(能够分成一个一个重复的阶原创 2020-05-31 22:04:42 · 498 阅读 · 0 评论 -
敏感词屏蔽——AC自动机
个人微信公众号:程序员宅急送一、算法介绍上一周我们讲了Trie树,这次的AC自动机是Trie树的一个改进版,也是一个多模式串匹配算法。区别在于Trie树——在一堆模串中找寻符合条件的前缀(搜索引擎的关键词弹出选项)AC自动机——找寻符合条件的后缀。二、算法讲解1、首先我们构建一个如图的Trie树如下图2、在学习KMP算法的时候,我们说到了好前缀的前缀子串和后缀子串匹配。在Tr...原创 2020-04-20 01:00:29 · 831 阅读 · 0 评论 -
搜索引擎的搜索关键字提示功能——Trie树
个人微信公众号:程序员宅急送百度、Google我相信大家都用过,在搜索框中输入一个字就能弹出很多可选的关键词,如下图像这种关键词搜索功能最底层的数据结构就是我今天要说的:Trie树。一、什么是Trie树?简单点说就是个多叉树。我们把每个字符串中重合的前缀合并在一起形成的多叉树!二、画个图说的话有些麻烦,我们直接来看图!三、代码实现typedef struct _TrieNod...原创 2020-04-20 00:58:50 · 497 阅读 · 0 评论 -
字符串匹配算法——KMP算法
个人微信公众号Geek_Zhai核心思想:KMP 算法就是在试图寻找一种规律:在模式串和主串匹配的过程中,当遇到坏字符后,对于已经比对过的好前缀,利用字符串的特点,尽可能多滑动几位,提高效率(听起来好像和BM算法差不多)算法讲解:KMP算法与BM算法最大的不同在两点1、从前往后匹配2、利用好前缀的前后缀子串最长匹配规则如下图与BM算法一样,这里的前后缀最长匹配长度,我们也可以提...原创 2020-04-20 00:55:42 · 208 阅读 · 0 评论 -
字符串匹配算法——BF算法(暴力匹配)
字符串匹配算法——BF算法(Brute Force)欢迎关注个人公众号:程序员宅急送公众号微信号:Geek_Zhai核心思想:假设我们主串长度为n,模串长度为m,BF算法就是要去遍历主串的n个字符,每次都再循环比对n-m+1个字符,所以时间复杂度是n*m;原理如下图:代码如下:class Solution{public: int BF(const string& s...原创 2020-04-06 11:58:19 · 647 阅读 · 0 评论 -
字符串匹配算法——RK算法(Rabin-Karp)
字符串匹配算法——RK算法(Rabin-Karp)欢迎关注个人公众号:程序员宅急送公众号微信号:Geek_ZhaiBF算法的特点就是简单粗暴直接,好理解,它的时间复杂度是O(n*m)。那能不能再优化一下呢?再快一点!这就是本篇文章要讲的RK算法(Rabin-Karp),这其实是两位大佬的名字。算法核心思想:利用哈希值匹配更快的优点来加快字符串匹配的速度。我们先求出主串所有长度与模串相...原创 2020-04-06 11:57:29 · 2046 阅读 · 0 评论 -
字符串匹配算法——BM算法
字符串匹配算法——BM算法欢迎关注个人公众号:程序员宅急送公众号微信号:Geek_Zhai核心思想:利用字符串的特点,跳过绝对不可能匹配的字符(多移动几个字符),提高效率。算法讲解:BM算法有两大规则:坏字符规则和好后缀规则1、坏字符规则图解如下光有坏字符是不够的!因为坏字符可能会出bug,让你后退着滑动…如下图2、好后缀规则鉴于坏字符规则可能出现的“倒滑”问题,我们需...原创 2020-04-06 11:53:10 · 566 阅读 · 0 评论 -
二分法在循环有序数组查找元素
//在 O(logN) 时间内,从循环有序数组里查找元素//二分之后,总有一半是有序数组public static int searchInLoopSortedArray(int[] nums, int target) { if(nums.length == 0) return -1; int low = 0; int high = nums.length - 1;...原创 2020-03-02 11:13:41 · 439 阅读 · 0 评论 -
如何使用二分法实现“求一个数的平方根”?要求精确到小数点后 6 位。
如何使用二分法实现“求一个数的平方根”?要求精确到小数点后 6 位。//precision精确度//a原数据double squareRoot(double a , double precision){ double low,high,mid,tmp; if (a>1){ low = 1; high = a; }else{ ...原创 2020-03-02 11:12:13 · 3742 阅读 · 0 评论 -
剑指offer——在一个二维递增数组中查找一个数
剑指offer——在一个二维递增数组中查找一个数题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数解题思路:因为二维数组,从左至右,从上至下递增。从上往下每一行遍历,当遍历到比target大的数字是,说明target只会出现在左下那块地方。然后缩小范...原创 2020-02-28 12:47:26 · 297 阅读 · 0 评论 -
最短路径:地图软件是如何计算出最优出行路径的?—— Dijkstra 算法 。
一、算法解析:我们可以把地图抽象成一个有权有向图,每一个路口都是一个图的顶点,每一条两路口之间的路的距离就是边的权重。路的行驶方向就是边的方向。那么我们求最优出行路径就可以转化成在一个有向有权图中,求两个顶点之间的最短路径。二、举例如下假设我们有下图这样的有权有向图,我们要从起点0到终点5找到最优(短)路径三、算法解析,Dijkstra 算法 ,准备如下:1、我们代码建立如下图的邻接...原创 2020-02-17 16:10:25 · 1689 阅读 · 0 评论 -
如何实现一个简单的音乐推荐系统?——利用欧几里得空间距离算法(向量空间距离)
举例如下:音乐推荐的两种推荐方式第一种:基于相似用户做推荐如何判断两个用户是相似用户?我们可以根据两个用户对一些随机的歌曲的喜爱程度进行相似度度量。一个用户对一首歌单曲循环记5分,分享记4分,收藏记3分,搜索记2分,听完记1分,没听过记0分,直接跳过记-1分; 安静 晴天 十年 后来你 5 3 3 0小明4 5 2 1那么你和小明的欧几里得距离就是(5−4)2+(3−...原创 2020-02-17 12:21:03 · 663 阅读 · 1 评论 -
拓扑算法
拓扑算法一、用途拓扑排序应用非常广泛,解决的问题的模型也非常一致。凡是需要通过局部顺序来推导全局顺序的,一般都能用拓扑排序来解决。除此之外,拓扑排序还能检测图中环的存在。例如:先穿内衣再穿外套,先穿袜子再穿鞋子,先穿内裤再穿裤子。根据局部顺序推导全局顺序为:内衣->外套->袜子->鞋子->内裤->裤子(结果不止一种,因为先穿袜子还是内衣没有顺序)二、原理把依...原创 2020-02-13 22:25:49 · 4254 阅读 · 1 评论 -
Redis的跳表
Redis的跳表#include <stdio.h>#include <stdlib.h>#include <iostream>#include <string>#include <cstring>#include <random>#include <ctime>using namespace st...原创 2019-12-31 16:19:36 · 194 阅读 · 0 评论 -
二分查找变体问题
二分查找变体问题假设数组是这样的(有重复){1,3,4,5,6,8,8,8,11,18}class Solution {public: //第一个等于给定值的值 int firstEqualSerach(int a[] ,int n,int value) { int low = 0; int high = n - 1; while (low <= high) {...原创 2019-12-31 00:03:14 · 159 阅读 · 0 评论 -
归并排序
个人理解:归并排序也是运用分区的思想,1、计算出一个中间点,然后左右分区2、不停地递归分区,直至无法分区3、当无法进行分区的时候,根据下标进行比较大小,存入临时数组4、递归返回阶段,每一次返回都会进行比较,存入数组归并排序是从下到上,需要一直递归分区直到无法再分区,再进行排序。图解:时间复杂度:最好最坏平均时间复杂度都是0(nlogn)空间复杂度 O(n)是否是稳定的排序?...原创 2019-12-05 17:58:24 · 123 阅读 · 0 评论 -
快速排序
个人理解:快速排序也是运用分区的思想,1、首先选择一个分区点或者叫做中间点,任意的都可以(因为最后会在中间位置交换)2、从头遍历数组,把比分区点小的让左边,比分区点大的放右边(这个时候,左右两边依旧无序,但是左大右小)3、把分区点放中间4、把左右两边继续进行快排(递归进行分区,左小右大,递归分区的时候是不会把前一次的分区点算进去的)5、分区越来越小,顺序越来越精准。与归并排序不同的是...原创 2019-12-05 17:50:54 · 105 阅读 · 0 评论 -
插入排序
时间复杂度最好O(n)最坏O(nn)平均O(nn)空间复杂度O(1)代码void insertSort(int a[],int n){ if(n<=1)return; for(int i =1;i<n;++i) { int value = a[i]; int j =i-1; for(;j>=0...原创 2019-12-04 17:11:00 · 91 阅读 · 0 评论 -
冒泡排序
代码void bubbleSort(int a[],int n){ if(n<=1) return ; bool flag = false; for(int i =0;i<n;++i) { //提前退出冒泡排序循环 flag = false; for(int j =0;j<n-i-1;++j) ...原创 2019-12-04 15:10:34 · 108 阅读 · 0 评论 -
链表的基本操作
链表的一些基本操作(想到了就写,慢慢更新)#include <iostream>#include<math.h>#include<typeinfo>using namespace std;/*单链表反转链表中环的检测两个有序链表的合并删除链表倒数第n个节点求链表的中间结点*/typedef struct node{ int d...原创 2019-11-20 15:12:19 · 113 阅读 · 0 评论 -
八皇后问题
一、什么是八皇后问题?八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?二、如何求解?以高斯为代表的许多数学家先后研究过这个问题。后来,当计算机问世,通过计算机程序的运算可以轻松解出这个问题。所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第...原创 2019-11-13 12:48:00 · 198 阅读 · 0 评论 -
时间空间复杂度分析
一、为什么要分析复杂度1、假设我们每次都直接用机器去运行代码来测试代码运行花费的时间,测试的结果很受硬件的影响,比如说i9的CPU和i3的测试结果肯定有很大的差距2、用机器去测试代码的效率很受数据规模的影响,举个极端的例子,几十个数据排序,插入排序可能比快排要快。所以我们要用一个不用具体的测试数据也不依赖于硬件条件的测试方法,来粗略的估算出算法(代码)的执行效率二、如何表示复杂度?T(n...原创 2019-11-12 01:13:01 · 194 阅读 · 0 评论 -
A星寻路算法简易版(代码实现)
绿色为起点,红色为终点,蓝色为墙不可走。启动只能上下左右不可以斜着走。以下为A*寻路算法代码实现,核心思想就是只走F值(格子评估值)最小的格子,直至到达终点。F值最小代表着从起点出发到达终点需要的最少的步数,只走最少的步数,那么路径就是最短的。#include <iostream>#include <vector>#include <string>...原创 2019-07-26 16:48:23 · 3557 阅读 · 0 评论