本章将从神经网络的最基本出发,用最简单明了的语言来介绍神经网络算法。...本文主要涉及到的知识点有: 前向传播 优化 反向传播 算法思想:从线性思想到最基础神经网络 在这里我们经常困惑于经常提到的“神经元”,其实神经网络的结构远没有神经元那样复杂和可怕,下面我们通过以前学到的东西进行一个组合...image.png 当是线性多分类问题的时候通常用一种前面学到的算法—softmax算法。...image.png 优化 通常用梯度下降,这里用到的梯度下降就是机器学习核心思想,就是通过前向传播得到损失函数,通过反向传播得到每个数据对最终损失函数的影响大小(导数),通过梯度下降迭代更新参数,使得损失函数最小...神经网络算法 把前面的内容进行组合,得到的数据叫做前向传播,(其实大多数是学过的内容,就多一个激活函数。)在加上用梯度下降来更新参数,就组成了神经网络的精髓。
算法思想 1.比较笨的枚举算法思想 2聪明—点的递推算法思想 3.充分利用自己的递归算法思想 4.各个击破的分治算法思想 5.贪心算法思想并不贪婪 6.试探法算法思想是—种委婉的做法 7.迭代算法...8.模拟算法思想 枚举算法思想 枚举算法思想的最大特点是,在面对任何问题时它会去尝试每一种解决方法。...递推算法思想 与枚举算法思想相比,递推算法能够通过已知的某个条件,利用特定的关系得出中间推论,然后逐步递推,直到得到结果为止。由此可见,递推算法要比枚举算法聪明,它不会尝试每种可能的方案。...递归算法思想 因为递归算法思想往往用函数的形式来体现,所以递归算法需要预先编写功能函数。这些函数是独立的功能,能够实现解决某个问题的具体功能,当需要时直接调用这个函数即可。...贪心算法思想 本节所要讲解的贪心算法也被称为贪婪算法,它在求解问题时总想用在当前看来是最好方法来实现。这种算法思想不从整体最优上考虑问题,仅仅是在某种意义上的局部最优求解。
- 力扣(LeetCode) class Solution { public: void sortColors(vector& nums) { //三路划分的思想...k个最大元素(快速选择算法) . - 力扣(LeetCode) class Solution { public: int findKthLargest(vector& nums, int...k) { //第k大 堆排 //第k小 //前k大 //快速选择算法 //前k小 //三路划分...还原 for (int j = left; j <= right; ++j) dp[j] = temp[j]; return ret; } }; 十,总结 分治思想的典型应用就是快速排序和归并排序...并且这种方式还可以解决top-k问题,并且时间复杂度是o(N)比堆排序还优秀,我们称之为快速选择算法。 2,归并排序的本质就是将问题划分成无数个合并两个有序数组的子问题。
思路:后缀是指要解决的子问题是原问题的后半部分,如果用字符串类描述,相当于子问题永远都是原问题的后半部分 str[i:] str[i:] 表示从下标i开始,一直到末尾的整个字符串 示例 最长公共子序列长度...[1:]B[3:]或者是A[2]B[2],同样的要计算A中以1结尾的字串和B中以2结尾的字串的最大子序列长度,先要看下A[0]B[2]的值 以A[1:]B[3:]为例,A[1]和B[3]一样,但是需要去计算...分析如下 从上面的最长公共字串思想,可以类比,要使一个字串变成另外一个字串,根据提供的3中操作方式,分别要去这三种可能性的最小值。...假定给的字符串是A和B,A要变成B,首先从第一个字符开始 A的第一个字符变成B的第一个字符,或者B的第一个字符变成A的第一个字符,达到条件 ,如果 A[0]==B[0],不需要变更dp[0,0]=dp[...dp表示从第0个下标开始,需要计算的最小值上面三种情况的最小值,数组本身是从0开始的,那从-1开始就代表一个字符都没有,显然这样的编辑距离就是另外一个有的长度,这也就使得初始值被建立,最终得到的程序如下
根据问题的不同,可以采用以下下几种常用的算法来进行求解: ・穷举算法; ・递推算法; ・递归算法; ・分治算法; ・概率算法。...指定范围之后,就可以使用循环语句和条件判断语句逐步验证候选答案的正确性,从而得到需要的正确答案。 二、递推算法 递推算法是很常用的算法思想,在数学计算等方面有着广泛的应用。...在许多数学问题中,都有着明确的计算公式可以遵循,因此往往可以采用递推算法来实现。 三、递归算法 递归算法是很常用的算法思想。使用递归算法,往往可以简化代码编写,提高程序的可读性。...这是因为附加的方法调用增加了时间开销,例如需要执行一系列的压栈出栈等操作。但在许多情况下,速度的差别不太明显。如果递归层次太深,还可能导致堆栈溢出。 四、分治算法 分治算法是一种化繁为简的算法思想。...分治算法往往应用于计算步骤比较复杂的问题,通过将问题简化而逐步得到结果。 分治算法的基本思想是将一个计算复杂的问题分为规模较小、计算简单的小问题求解,然后综合各个小问题,得到最终问题的答案。
一、模拟算法的总结 1、本质:比葫芦画瓢 2、特点:思路较简单,根据题目要求即可,代码量和细节较多 3、解决方法: (1) 模拟算法流程,在草稿纸上进行演算 (2) 认真审题,考虑细节问题和边界情况...=s.size(),d=2*numRows-2;//d是公差 //先处理第一行 for(int i=0;i<n;i+=d) ret+=s[i]; //处理中间的行...1;i<n;++i) { string temp;//每次都要更新 int len=ret.size(); //定义双指针 从前往后遍历相同的区域...=0) return -1;//最后还要再检查一次 return hash[n-1]; } }; 写法2:只用一个数组模拟的哈希表,手动去控制字符和下标的映射关系(用switch语句...vector freq_count;//统计各个频率的出现次数 };
思路:运用动态规划去解决问题,这个时候子问题并不是属于父问题的"前缀",也不是属于父问题的"后缀",而是属于父问题的某个区间之内。...,需要解决类似 这样的,属于原始问题的某个区间内子集的问题。...最终要计算的结果用dp(0,3),其中0表示输入的矩阵数组中的下标为0的位置,3是下标为3的位置,以此表示最终要囊括ABC三个矩阵。...表格中的横轴表示开始计算的下标,纵轴表示结束计算的下标,这种表示方式,当横轴值大于纵轴值时(如坐标2,0),可以忽略,不需要计算。...为得到3,从下标之间的关系可以看出,他们就是初始值,即只要有初始化的过程即可 现在逆向来看(从4到1),计算的过程可以抽象为如下的一个过程 先按照蓝线箭头部分计算对应位置的值,将它存储起来,然后计算绿线部分的值
一、栈的经典应用:波兰表达式与逆波兰表达式 我们平时看到的 1+2*(3-4*5)+6/7 叫做中缀表达式,平时我们习惯用这个计算的原因是我们可以整体地去看到这个表达式并且清楚地知道各个运算符的优先级...如上面这个例子,当按照计算机的逻辑去扫描了1+2的时候,并不敢直接去进行运算,因为可能后面存在一个优先级更高的操作符会优先进行计算。甚至有些时候还会出现括号这一种可以改变操作符优先级的符号!!...ret.size()) ret.pop_back(); } return ret; } }; 八、字符串解码 . - 力扣(LeetCode) 该题也是利用到基本计算器的解题思想...,就将当前的数*10+下一个数字,当不再是数字的时候,将提取出来的数字入数字栈。...然后我们的新操作符要跟栈顶的操作符进行比较,如果运算的优先级较低或相等,就得将栈顶的操作符弹出来进行计算,即进行calc,不断重复该过程,直到新加入的操作符优先级比栈顶元素高,此时再将新操作符入栈 细节处理
:将正整数变成他的每位数的平方之和,有可能会一直循环始终到不了1,也有始终是1(快乐数) 思路:快慢双指针算法 以上的两个结论在博主的关于链表带环追击问题的文章里面有分析 顺序表、链表相关OJ题(2)-.... - 力扣(LeetCode)有效三角形的个数 思路1:升序+暴力枚举 思路2:升序+利用双指针算法 class Solution { public: int triangleNumber.... - 力扣(LeetCode)查找总价格为目标值的两个商品 思路1:两层for循环找到所有组合去计算 思路2:利用单调性,使用双指针算法解决问题 class Solution { public:...2、快慢指针:其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列结构上移动。 这种⽅法对于处理环形链表或数组⾮常有⽤。...(如第3题,以及链表带环的问题) 注意事项: 其实不单单是环形链表或者是数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使⽤快慢指针的思想。最常用的就是快指针走两步,慢指针走一步。
梯度下降的场景假设 梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。...所以我们只要沿着梯度的方向一直走,就能走到局部的最低点! 梯度下降算法的数学解释 上面我们花了大量的篇幅介绍梯度下降算法的基本思想和场景假设,以及梯度的概念和思想。...下面我们就开始从数学上解释梯度下降算法的计算过程和思想! 此公式的意义是:J是关于Θ的一个函数,我们当前所处的位置为Θ0点,要从这个点走到J的最小值点,也就是山底。...梯度下降算法的实例 我们已经基本了解了梯度下降算法的计算过程,那么我们就来看几个梯度下降算法的小实例,首先从单变量的函数开始 单变量函数的梯度下降 我们假设有一个单变量的函数 函数的微分 初始化,起点为...我们假设初始的起点为: 初始的学习率为: 函数的梯度为: 进行多次迭代: 我们发现,已经基本靠近函数的最小值点 梯度下降算法的实现 下面我们将用python实现一个简单的梯度下降算法。
arr(n+1); for(int i=1;i>arr[i]; //创建一个前缀和数组 vector dp(n+1);//默认初始化的时候是...hash[0]=1;//默认有一个前缀和为0的数组 int sum=0;//记录前缀和 int ret=0;//记录有多少个和为k的子数组...,因为我们要找的是最长的 } return ret; } }; 八、最大子数组的和 . - 力扣(LeetCode) class Solution { public...+dp[x1-1][y1-1]-dp[x2][y1-1]-dp[x1-1][y2]; } return answer; } }; 十、前缀和算法总结...1、前缀和并不一定真的需要搞一个前缀和数组 2、用哈希存前缀和相关数据的话要注意hash[0] 3、无论dp数组是开的n还是开的n+1,都要注意和原数组之间的映射关系。
一、链表的常见技巧总结 二、两数相加 . - 力扣(LeetCode) class Solution { public: ListNode* addTwoNumbers(ListNode* l1...10; } ListNode*ret=newhead->next; delete newhead; return ret; } }; 三、两两交换链表中的节点...{ fast=fast->next->next; slow=slow->next; } return slow;//此时慢指针指向的就是最小的节点...,为空就不入 heap.pop(); if(it->next) heap.push(it->next); } //此时全部的元素都插入完成了...(n*k*logk) } }; 分治思想: //策略,利用递归解决问题,结合归并排序,合并两个有序链表 (利用分治思想) class Solution { public: ListNode
希尔排序算法思想 把记录按下标的一定增量分组,对每组使用 直接插入排序算法 排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。...希尔排序算法过程: 先取一个正整数gap ---- 例如数组a[49, 38, 65, 97, 26, 13, 27, 49, 55, 4] 第1次 步长 gap = 10 / 2 = 5 分成了五组(...---- 希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(n^(3/2)),希尔排序时间复杂度的下界是n*log2n,希尔排序时间复杂度...希尔排序不是稳定排序算法。...算法实现 希尔排序算法伪代码 //希尔排序 input: an array a of length n with array elements numbered 0 to n − 1 gap ← round
说到神经网络,大家看到这个图应该不陌生: 这是典型的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层,Layer L3是隐含层,我们现在手里有一堆数据{x1,x2...如果你的输出和原始输入不一样,那么就是很常见的人工神经网络了,相当于让原始数据通过一个映射来得到我们想要的输出数据,也就是我们今天要讲的话题。 ...本文直接举一个例子,带入数值演示反向传播法的过程,其实也很简单,感兴趣的同学可以自己推导下试试:)(注:本文假设你已经懂得基本的神经网络构成,如果完全不懂,可以参考Poll写的笔记:[Mechine Learning...传统的BP算法改进主要有两类: 启发式算法:如附加动量法,自适应算法。 数值优化算法:如共轭梯度法、牛顿迭代法等。...3,引入陡度因子 核心思想:如果在调整进入平坦区后,设法压缩神经元的净输入,使其输出退出激活函数的不饱和区,就可以改变误差函数的形状,从而使调整脱离平坦区。
一.长度最小的数组 . - 力扣(LeetCode)长度最小的数组 class Solution { public: int minSubArrayLen(int target, vector& nums) { int len=INT_MAX,n=nums.size(),sum=0;//len必须要给一个很大的数,否则 for(int...0:len; } }; 二.无重复字符的最长字串 . - 力扣(LeetCode)无字符的最长字串 class Solution { public: int lengthOfLongestSubstring...:s.substr(begin,minlen); } }; 八.串联所有单词的子串 . - 力扣(LeetCode)串联所有单词的子串 class Solution { public:...如下图这一题 涉及到不同的种类需要统计数量的时候,常常会用到哈希表!! (5-7题) 后面有类似题目会持续更新!!
> ret(n+1); for(int i=1;i<=n;++i) ret[i]=countOnes(i); return ret; } }; 思路2:动态规划思想...(本质是根据位运算的性质通过已经计算出来的状态去求未计算的状态) 即当计算 i 的「一比特数」时,如果存在 0≤j<i,j 的「一比特数」已知,且 i和 j 相比,i 的二进制表示只比j多了一个 1,...(利用位运算的性质) 1、设置最低位 对于n(n-1),本质上是将最右侧的1干掉,所以一定会比原来的n小!! 因此bit[i]=bit[i&(i-1)]+1 恒成立!!...y,使得 y≤x,y 是 2的整数次幂,则 y的二进制表示中只有最高位是 1,其余都是 0,此时称 y 为 x 的「最高有效位」。...bool isUnique(string astr) { if(astr.size()>26) return false;//鸽巢原理做优化 //利用位图的思想
由于本人也是编程初学者,所以本书比较浅显易懂,所介绍的算法配上插图也十分易懂,这里只是介绍几种最基础的算法由浅入深以帮助理顺一些简单的思维逻辑。 算法简介 算法是一组完成任务的指令。...对于这个猜数字的游戏使用二分法思想完成的代码如下: #二分法 def two(lists,item): low=0 high=len(lists)-1 while low<=... 算法的速度指的并非时间,而是操作数的增速。 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。 算法的运行时间用大O表示法表示。 ...狄克斯特拉算法 还是解决最短路径的算法,不过他解决的是加权图的最短路径。也就是说在狄克斯特拉算法中,你给每段都分配了一个数字或权重,因此狄克斯特拉算法找出 的是总权重最小的路径。 ...这就是贪婪算法。虽然贪婪算法是万能的但是他往往不是最优的,但是对于一些没有更好的解决方法,贪婪算法往往是最有效的。
一、哈希表剖析 1、哈希表底层:通过对C++的学习,我们知道STL中哈希表底层是用的链地址法封装的开散列。 2、哈希表作用:存储数据的容器,插入、删除、搜索的时间复杂度都是O(1),无序。...) 思路来源:. - 力扣(LeetCode)分桶思路详细讲解 因为这个思路来源写得非常的详细,所以直接看就行,以往我们的分桶,更多的是针对整数的分桶,但是在该题中,扩展了存在负数的时候如何分桶...,保证每个桶内的元素个数是一样的。...这是一种非常巧妙的方法!!!要结合具体的实例去看!! 核心思路:保证每个桶内的绝对值相差小于t,k个桶。...当我们遍历到这个数的时候,如果对应的桶的存在,就是true,如果相邻桶存在,看看差值是否符合要求。每个桶中只会有一个元素,因为有多的我们就会直接返回结果。
一、二分查找算法思路总结 大家先看总结,然后再根据后面的题型去慢慢领悟 二、二分查找(easy) . - 力扣(LeetCode)二分查找 思路:(模版1)正常的二分查找策略 class Solution.... - 力扣(LeetCode)在排序数组中查找元素的第一个位置和最后一个位置 要注意示例3提到的边界情况!!...二分查找的策略基本上都是去找一个数,对应的有三种模版:正常的二分查找、左区间端点查找、右区间端点查找。...最常用的就是左区间端点(关键是left会大跳跃,且目标位置在较大值区间的左边)和右区间端点法(关键是right会大跳跃,且目标位置在较小值区间的右边)。...后面有遇到相关oj题博主会继续更新的……感谢支持!!
领取专属 10元无门槛券
手把手带您无忧上云