算法
文章平均质量分 70
transformer_WSZ
You Only Look Once!
展开
-
扔鸡蛋问题
这是一道非常经典的google面试题,在此记录一下。具体案例引导可见:扔鸡蛋问题(四种解法)思路这里介绍动态规划的解法:我们假设 F(K,N) 表示有 K 个鸡蛋、N 层楼,测出其摔碎临界点所需的最少次数,那么有如下状态转移公式:F(K,N)=1+min1≤i≤Nmax(F(K,N−i),F(K−1,i−1))F(K, N) = 1 + min_{1 \leq i \leq N} max(F(K, N-i), F(K-1, i-1))F(K,N)=1+min1≤i≤Nmax(F(K,N−i)原创 2021-08-26 01:05:42 · 155 阅读 · 0 评论 -
常见排序算法的比较
记录一下各种常见排序算法的比较。名称思想最好时间复杂度最坏时间复杂度平均时间复杂度空间复杂度是否稳定冒泡排序两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止O(n)O(n)O(n)O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)O(1)O(1)O(1)是插入排序把nnn个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n−1n-1n−1个元素,排序过程中每次从无序表中取出第一个元素,将它原创 2021-04-07 17:50:40 · 98 阅读 · 0 评论 -
CRF损失函数与Viterbi算法
CRF考虑到了输出层面的关联性,如下图所示:损失函数时间步 ttt 输出的标签值由两部分组成:发射分数:h(yt;X)h(y_t;X)h(yt;X)转移分数:g(yt;yt−1)g(y_t;y_{t-1})g(yt;yt−1)一条路径标识为 y1,y2,…,yny_1, y_2, \dots , y_ny1,y2,…,yn 的概率为:P(y1,y2,…,yn∣X)=1Z(X)eh(y1;x)+∑i=2ng(yi;yi−1)+h(yi;X)P(y_1, y_2, \dots,原创 2021-03-24 12:47:55 · 1187 阅读 · 0 评论 -
logistic回归参数求解推导
记录一下逻辑回归的参数求解推导过程:损失函数线性回归的表达式为:f(x)=wx+bf(x) = wx+bf(x)=wx+b,为了消除后面的bbb,令θ=[wb],x=[x1]T\theta = [w \quad b], x = [x \quad 1]^Tθ=[wb],x=[x1]T,则f(x)=θxf(x) = \theta xf(x)=θx;将其转换为逻辑回归模型:y=σ(f(x))=σ(θx)=11+e−θxy=\sigma(f({x}))=\sigma\left({\theta} {x}\rig原创 2021-03-23 22:00:06 · 686 阅读 · 0 评论 -
Transformer面试要点
Transformer的核心在如下两张图上:1. 为什么Transformer 需要进行 Multi-head Attention?将模型分为多个头,形成多个子空间,让模型去关注不同方面的信息;把多头注意力看作一个ensemble,模型内部的集成,类似于CNN中使用的多个卷积核,所以很多时候可以认为多头注意力可以帮助我们捕捉到更为丰富的特征信息。2. Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?如果Q,K,V都是一个值,那么就变为了Self原创 2021-03-18 23:48:14 · 558 阅读 · 0 评论 -
从两个有序数组中查找中位数
这道题题目描述很简单,但却是leetcode hard难度。如果用传统的二分查找方法来做,那么边界情况将非常多。本题将寻找两个有序数组的中位数看作是从两个有序数组中查找第k小元素,具体讲解见:详细通俗的思路分析,多解法(解法三)。代码如下:class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: def getKthElement(k):原创 2021-03-12 23:40:56 · 101 阅读 · 0 评论 -
从有序数组中查找不小于(不大于)某数的第一个(最后一个)元素
不小于某数的第一个元素def binary_search_notlessthan_first(arr, target): low = 0 high = len(arr)-1 res = -1 while low <= high: mid = (low+high)//2 if target <= arr[mid]: res = mid high = mid-1 else原创 2021-03-12 13:54:25 · 726 阅读 · 0 评论 -
反向传播
简介误差反向传播算法简称反向传播算法(Back Propagation)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它的基本思想如下:将训练集数据输入到神经网络的输入层,经过隐藏层,最后达到输出层并输出结果,这就是前向传播过程。由于神经网络的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;在反...原创 2019-05-18 22:58:54 · 9446 阅读 · 5 评论 -
P问题、NP问题和NPC问题
时间复杂度常见的时间复杂度分为两种级别:多项式级:O(1) , O(log(n)) , O(n^k);非多项式级:O(a^n) , O(n!)当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。自然地,人们会想到一个问题:会不会所有的问题都可以找到复杂度为多项式级的算法呢?很遗憾,答案是否定的。有些问...转载 2019-01-24 22:06:42 · 1384 阅读 · 0 评论 -
间隔删数
题目如下 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。本人对Java比较熟悉,第一想到的就是使用 LinkedList 类。接下来是暴力破解原创 2017-08-28 00:52:30 · 598 阅读 · 0 评论 -
求给定字符串中最长回文序列
对字符串来说,将其逆序后仍能跟自己相等即为回文。例如 “asdsa”.代码如下:import java.util.HashSet;import java.util.Iterator;import java.util.Set;import java.util.Stack;public class Test { //判断该字符串是否为回文序列 public static boole原创 2017-08-22 20:51:41 · 614 阅读 · 0 评论 -
求给定两字符串的最长相同子串
import java.util.HashSet;import java.util.Iterator;import java.util.Set;import java.util.Stack;public class Test { //调整栈 //如果栈为空,则将s压入栈 //由于栈中存放的是最长相同子串(可能有多个长度相同的子串,而它们的内容也可能相同,例如"asd","原创 2017-08-23 15:03:16 · 1070 阅读 · 0 评论 -
冒泡排序
基本思想:对于一个已经排好序的数组,它的任意两个相邻元素,都应该满足arr[i-1]<=arr[i]。冒泡排序暴力地实现了这一目标:不断扫描相邻元素,看它们是否违章。一旦违章,立即纠正。在冒泡排序时,程序从左往右(也可从右往左)遍历数组,比较相邻的两个元素。如果顺序错误,那么交换两个数组元素的位置。如果顺序正确,则不交换。经过一次遍历,我们可以保证最大的元素在最右边。 遍历结束后,继续重复扫描,总原创 2017-08-03 13:18:20 · 264 阅读 · 0 评论 -
快排
快排的大致思想是:以一个数为枢轴,比它大的放到右边,比它小的放到左边。# include <iostream>using namespace std;void QuickSort(int arr[],int low,int high){ if(low >= high)//此时只有一个数,不需要排序 return; int first = low; int las原创 2017-06-07 13:47:00 · 676 阅读 · 0 评论 -
归并排序
归并排序采用递归和分治的思想。分治主要是将两个无序数组合并成一个有序数组。# include <iostream>using namespace std;void MergeTwo(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex){//0,4,9 int i = startIndex; in原创 2017-06-07 13:54:45 · 258 阅读 · 0 评论 -
二分查找
对于有序数组而言,二分查找效率是最高的。# include <iostream>using namespace std;//递归void RecursiveBinarySearch(int arr[],int low,int high,int target){ int mid = (low + high)/2; if(low > high){ cout << "查找原创 2017-06-09 12:26:13 · 323 阅读 · 0 评论 -
闭包算法
问题描述根据求属性集闭包的算法,用你熟悉的语言编写程序,要求如下: 1. 由用户输入函数依赖,当用户输入End时,表示所有依赖都输入完毕。(即函数依赖是由用户自己定的,程序中不能假定某个具体的依赖) 2. 函数依赖的形式是 AB->C, A->BE 这样的形式,为了简单起见,我们假定所有的属性都是用英文的大写字母表示,由A到Z。(提示,你可以让用户先输入依赖左边的属性,然后再输入依赖右边的属性,原创 2017-07-10 23:00:19 · 2165 阅读 · 0 评论 -
选择排序
public class Test{ public static void Sort(int arr[]){ int i , j , temp , min; for(i = 0 ; i < arr.length - 1 ; i++){ min = i; for(j = i + 1 ; j < arr.length原创 2017-07-15 16:42:37 · 231 阅读 · 0 评论