![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
文章平均质量分 64
lynne233
偶尔写影评剧评,豆瓣账号:https://www.douban.com/people/lynne_xuan/reviews
展开
-
文本分类经典论文解读(之二)textrnn, HAN, textrnn with multitask
本文同步发布于公众号:阿黎投喂舍文本分类系列:文本分类经典论文:fasttext,textcnn解读分享 | 叮,情感分类从入门到放弃资料推荐来咯~简介上一篇文章基于深度学习的文本分类论文推荐——fasttext,textcnn介绍了文本分类中非常经典的三篇文章有关2个模型Fasttext和Textcnn,今天为大家推荐3篇论文,这3篇论文将RNN,多任务结构和attention应用到文本分类的任务中,对于想了解多任务和attention的同学来说是个很不错的入门论文哦~Rec.原创 2020-11-17 11:53:37 · 1065 阅读 · 0 评论 -
ZEN-基于N-gram的中文Encoder(从论文到源码)
相关背景深度学习的encoder都是基于大规模的未标注数据,但是这些encoder是否完整利用了语料的所有信息,这是未被证实的。类似于Bert的这些预训练模型使用的是文本的最小单位——字。但是中文的最小单位并不是字,中文的语义和N-gram有很大的关系。目前模型的缺陷1. 基于word masking,encoder只能学习到已有的词和句的信息2. 基于mask的方法在pre-train和...原创 2020-02-14 11:38:29 · 1109 阅读 · 0 评论 -
ResNet阅读笔记
背景与问题当前神经网络的训练存在两种问题:一是梯度爆炸和梯度消失,2二是随着网络深度的增加,准确率不会上升,并且可能会下降。下降并不是过拟合,而是因为层数的增多导致训练的准确率下降,训练的错误率本来就会很高。这就是深度网络的退化问题。下图演示了上述二所述的现象。在如何解决这个问题上,作者考虑一个简单地事实,在浅层网络上增加深的层,这些层是浅层网络的恒等映射(identity mapping)...原创 2020-01-09 02:02:25 · 254 阅读 · 0 评论 -
Gray Code解题报告
https://leetcode.com/problems/gray-code/格雷码,其实我没有搞清楚格雷码的规律。以3为例,我以为是这样的:000,001,010,011,100,101,110,111所以并没有什么规律,但是,其实格雷码是这样的:000,001,011,010,110,111,101,100这样规律就很明显了,第n个数字的格雷码就是给第n-1个数字的格雷码原创 2016-10-07 15:53:02 · 258 阅读 · 0 评论 -
Palindrome Partitioning解题报告
https://leetcode.com/problems/palindrome-partitioning/一般这种求全部排列的都是用DFS+backtracing解决。但是求s[i…j]是否是回文,如果将字符串倒序,然后判断,难免太浪费时间。可以先用动态规划求解然后再进行回溯。回溯的思想就是从一个位置出发,依次对其后的位置进行substr截取,判断是否为回文串,然后再从该位置出发继续进行判断原创 2016-10-08 14:21:30 · 230 阅读 · 0 评论 -
Wiggle Subsequence解题报告
https://leetcode.com/problems/wiggle-subsequence/这道题和最长子序列,Divisible Subset题目类似,都可以用O(n2)的时间复杂度完成。可以想象,对于第i个数,dp[i]=dp[j]+1,当且仅当dp[j]+1>dp[i]而且nums[j]和nums[i]的差值和j所处位置的差值符号相反。所以,代码如下:class Solut原创 2016-11-29 10:57:22 · 198 阅读 · 0 评论 -
Dungeon Game解题报告
https://leetcode.com/problems/dungeon-game/这道题我看了别人的方法,用了很久才理解。用一个二维数组保存进入该点之前,确保骑士走出该点血量大于0,且骑士能够救出公主的值。显然对于最后一个点res[m][n]=max(1,1-dungeon[m][n])。对于其他的点需要明确一点,从该点走出之后我们要去他右边或者下边的点,右边或者下边的点的值就是我们走出这原创 2016-11-30 11:45:03 · 381 阅读 · 0 评论 -
Burst Balloons解题报告
https://leetcode.com/problems/burst-balloons/这道题我一直不知道怎么做,后来看了别人的答案。其实这就是用了dp的记事簿的方法,dp[i][j]表示i到j这个区间的最大取值。但是这个怎么算呢?还是得懂i到j之间一个一个的算。那这样想岂不是应该是回溯法?但是回溯法容易把一个问题重复计算多变,从而造成时间和空间的浪费。所以用记事簿法是比较合适的。dp[原创 2016-11-15 11:30:40 · 278 阅读 · 0 评论 -
Integer Break解题报告
https://leetcode.com/problems/integer-break/这道题有一个提示:You may check the breaking results of n ranging from 7 to 10 to discover the regularities.我们来从1到10来分别进行拆分:正整数从1开始,但是1不能拆分成两个正整数之和,所以不能当输出。那原创 2016-11-24 12:19:15 · 299 阅读 · 0 评论 -
Counting Bits解题报告
https://leetcode.com/problems/counting-bits/在这道题里有一个提示, does the odd/even status of the number help you in calculating the number of 1s,仔细考虑一下,对于二进制数而言,右移就是将数变为原来的2倍。而整数的除法除以二相当于除以二的数向下取整。所以对于一个数的而言原创 2016-11-24 12:20:34 · 238 阅读 · 0 评论 -
Combinations解题报告
https://leetcode.com/problems/combinations/题目描述见链接。这道题的意思是求n个数字中k个数字的组合。一看到这种类型的应该就知道是要用回溯的方法做了。 回溯的条件是找到k个数字或者目前要找的数字大于n。回溯的变量就是当前要加入数组的数字,从1开始,一直计算到n。代码:class Solution {private:vector > re原创 2016-10-07 15:17:07 · 334 阅读 · 0 评论 -
word break解题报告
Word BreakGiven a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.For example, givens = "leetcode",dict原创 2016-10-18 14:33:19 · 455 阅读 · 0 评论 -
最长上升子序列
Longest Increasing Subsequencehttps://leetcode.com/problems/longest-increasing-subsequence/求最长上升子序列,这是一道很经典的题,这道题有两种解法。一种是O(n2)的时间复杂度。用一个数组res记录从第一个节点开始到第i个节点的最长上升子序列。对于每一个点,我们从头开始遍历,如果碰到有num[j]原创 2016-11-08 14:29:24 · 236 阅读 · 1 评论 -
Range Sum Query系列解题报告
Range Sum Query - Immutablehttps://leetcode.com/problems/range-sum-query-immutable/这道题其实主要考虑的是减法,i~j的和就等于0~j的和减去0~i的和。class NumArray {private:vector sum;public: NumArray(vector &nums) {原创 2016-11-08 14:27:55 · 386 阅读 · 0 评论 -
Unique Binary Search Trees
Unique Binary Search Treeshttps://leetcode.com/problems/unique-binary-search-trees/如果示例的图是这么画的:那就比较好理解了,因为以1为根的树左子树是0个节点,右子树是2个节点,以2为根的树,左右子树各1个节点,以3位根的节点左子树为02个节点,右子树为0个节点。所以f(3)=f(原创 2016-10-27 11:58:39 · 191 阅读 · 0 评论 -
Ugly Number系列解题报告
Ugly Numberhttps://leetcode.com/problems/ugly-number/如果一个数的因子只有2,3,5那么这个数就是丑数。1默认是,0默认不是。怎么判断一个数是不是丑数,将这个数不断的分解,就可以了。class Solution {public: bool isUgly(int num) { if(num==1) retu原创 2016-11-07 15:13:50 · 319 阅读 · 0 评论 -
Word Search II解题报告
https://leetcode.com/problems/word-search-ii/这道题可以用暴力搜索解决,对每一个元素进行判断。class Solution {public: vector findWords(vector>& board, vector& words) { vector res; if(board.size()==0原创 2016-10-24 12:43:57 · 314 阅读 · 0 评论 -
N皇后问题
N-Queens问题描述:https://leetcode.com/problems/n-queens/在学习回溯的时候,八皇后问题是一道非常有名的问题,八皇后的问题的描述是:在一个8*8的棋盘上放置8个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。当将问题扩展之后就变成了N皇后的问题。题目给你一个数字N,让你返回满足条件的棋盘格局。这道题主原创 2016-09-22 11:45:01 · 219 阅读 · 0 评论 -
Design Twitter解题报告
https://leetcode.com/problems/design-twitter/这道题是让我们实现一个简单的tweet,就是实现follow用户,unfollow用户和获取最新tweet的功能。最复杂的获取最新tweet。我们用一个计数器表示时间,每发一条tweet,时间加一,时间越大表示距离现在越近。这里我们维护一个大小为10的map,遍历用户关注的每一个用户发的每一个帖子。原创 2016-09-21 21:36:26 · 202 阅读 · 0 评论 -
Top K Frequent Elements解题报告
https://leetcode.com/problems/top-k-frequent-elements/这道题的意思是选择出现频率前k位的元素,开始我想的是选择排序,后来发现,选择排序是找第k大元素的方法==。一般来说求数组出现频率最高的数字都要用map来记录数字出现的频率,然后按照出现次数再次排序。这里可以用堆排序做。所以现在要复习一下堆排序了:堆,可以看做是一棵完全二叉树,因为原创 2016-09-21 19:17:27 · 248 阅读 · 0 评论 -
Coin Change解题报告
https://leetcode.com/problems/coin-change/这道题其实也相当于是动态规划中的记事本问题。给定硬币的数量集合,要求一个钱数能够硬币求和的最小硬币数。我们可以先设置一个数组,来表示i钱数能够被res[i]个硬币组合。那么res[i]=min(res[i],res[i-coin[j]]+1)class Solution {public: in原创 2016-11-24 12:28:58 · 723 阅读 · 0 评论 -
图的拓扑排序
在了解图的拓扑排序之前我们需要介绍有向图。有向图是指在图中节点和节点之间的连接边是有方向的。有向图的拓扑排序是指对有向图中的节点对其进行现行的排序。如下图中要完成8,必须完成3和7,要完成11必须先完成5和7等等。这些就是节点之间的顺序,如果我们按照从上到下的顺序进行排序是:5,7,3,11,8,2,9,10。这是这个图的一个拓扑排序。这里我们需要介绍几个概念:度:依附于某顶点v的原创 2017-01-03 14:55:53 · 935 阅读 · 0 评论 -
[leetcode]Patching Array题解
题目描述: https://leetcode.com/problems/patching-array/description/问一个数组中需要添加几个数字才能保证数组中的数字任意组合保证可以得到1~n中的任意一个数字的和。Naive Solution从1~n中每个数字挑出来,判断是否可以由数组中的数字组成和,如果不可以则将数字加入数组。其中判断是否可以由数组中的数字组成和可以用递归...原创 2018-09-20 15:48:25 · 197 阅读 · 0 评论 -
图的邻接表和邻接矩阵表示以及相关算法
图是由定点的非空有限集合V与变得集合E组成的,其形式化定义为:G = (V, E),若图中的每一条边是没有方向的则称G为无向图,否则称为有向图。图的表示方法有邻接矩阵和邻接表表示法。图的常见算法有深度优先搜索,广度优先搜索,Prim算法,dijsktra算法,floyd算法,拓扑排序和关键路径。我用C++进行了实现,代码如下,具体的算法请上网搜索。 图的邻接矩阵表示:#include <iostr原创 2017-05-18 16:44:33 · 1681 阅读 · 0 评论 -
红黑树
红黑树是一种数据结构,C++的set, map,和linux的内存管理都是用红黑树实现的。红黑树也是一棵二叉查找树,但是因为其自身结构的特点,其本身非常均衡。时间复杂度为O(logn)。因为在每次插入一个节点或者删除一个节点,红黑树都要对此进行调整。 下面先介绍红黑树的特点,红黑树具有以下几个特征:1.每个节点不是红色就是黑色的; 2.根节点总是黑色的; 3.如果节点是红色的,则它的子节点必须原创 2017-05-15 17:46:20 · 407 阅读 · 0 评论 -
外排序
外排序和内排序是两种截然不同的排序算法,因为外排序是对文件进行排序,通常文件很大我们不能一次性读入内存。因此我们需要使用外排序。外排序常用的算法是多路归并排序。多路归并排序是指把文件分成n个已经排好序的文件,然后对每个子文件同时读入,选出当前指针最小的值输出,然后该指针后移,直到处理完所有子文件。 现在我们模拟外排序,内存使用最多1M,对1 ~ 10000000个数进行外排序。 首先是数据生成部原创 2017-05-25 21:03:24 · 478 阅读 · 0 评论 -
中序表达式转后序(计算版)
以前写了一个中序表达式转后序表达式,今天发现有一部分是错的,现在进行更正: 而关于如何将中序表达式转为后序表达式。可以参考上面的做法,建立两个栈s1和s2,s1存储后序表达式的结果,s2存储运算符号。从左到右遍历,如果当前符号是数字则推入s1,如果当前符号是”(“推入s2,如果当前符号是”)”,将(之前的符号都弹出,推入s1;如果当前符号的优先级大于s2的顶部,则推入栈,否则一直弹出直到当前符号原创 2017-04-24 19:01:55 · 1406 阅读 · 0 评论 -
排序算法
排序的算法有泡排序、选择排序、堆排序、插入排序、快排、归并排序和基数排序。 泡排序的基本思想是:将序列中的第一个元素与第二个元素进行比较,若前者大于后者则两者交换位置,否则不交换;依次类推直到n - 1个元素与第n个元素比较为止。经过如此一趟排序,使得n个元素中值最大的元素被安置在序列的第n个位置上。然后再对n - 1个元素进行相同的处理。 泡排序的代码如下:void bubbleSort(ve原创 2017-05-23 16:23:53 · 267 阅读 · 0 评论 -
KMP算法
字符串匹配最基础的算法是一个字符一个字符的匹配,若当前不匹配则指针指向下一个字符。基础算法的写法为:int findString(string &s, string &t){ int slen = s.size(); int tlen = t.size(); if (slen < tlen) { return -1; } int j = 0;原创 2017-05-11 16:14:37 · 268 阅读 · 0 评论 -
dijsktra算法
哈哈本来想着有时间写一下低价dijsktra算法的,结果今天就写了。但是只是针对一个节点的。#include #include #include #include using namespace std;bool hasPath(string &w1, string &w2) { if (w1.size() != w2.size()) { return原创 2017-04-05 21:46:57 · 806 阅读 · 0 评论 -
位运算相关知识
位运算可以直接操作计算机内存中的整数的二进制位,位运算包括按位取反,按位与,按位或,按位异或,按位左移,按位右移六种运算。计算机在运算的时候是以补码进行运算的,所以运算会把符号也一并运算。按位取反(~a) 把一个数的二进制位取反,0变成1,1变成0,如果是有符号的数据符号也会一并取反按位与(a & b) 按位相与。包括符号。按位与的应用:1 判断奇数偶数:奇数和1与1,偶数和1与是0原创 2017-03-23 14:38:40 · 271 阅读 · 0 评论 -
模运算与逆元
前两天做了一道题是关于模运算的。模就是我们常说的取余。例如4 % 6 = 4,6 % 4 = 2。模运算的运算规则和四则运算类似。但是除法除外,有关这一点我们在后面会详细讲。首先我们先介绍一下模运算的运算规则:(a + b) % p = (a % p + b % p) % p(a - b) % p = (a % p - b % p) % p(a * b) % p = (a % p原创 2017-03-13 20:08:28 · 17428 阅读 · 0 评论 -
union find(并查集)
在了解并查集之前我们需要了解一下动态连通性, 假设我们现在有10个点,1,2,3…,10。如果10个点相互独立,那么我们现在有10个连通分量。如果我们将1和2连接起来,那么我们现在就有9个连通分量了。现在假设我们不断地输入两个连通的点,怎么动态的求出这些点的连通分量呢?这就可以用到并查集这种数据结构了。 首先我们需要确定有多少个点,每个点属于哪个连通分量。在我们刚才提的问题中是属于比较简单的原创 2017-04-08 16:33:43 · 252 阅读 · 0 评论 -
树状数组(Binary Indexed Tree)
Binary Indexed Tree,从字面上来看是数,但是其实是数组。这个数组主要用来数组求和。例如对于某个数组[1,2,3,4,5],其树状数组的定义是:c[i]=a[i-2^r+1]+...+a[i],其中r是i二进制中最后一个1的长度。2^r的确定是i & (i ^ (i - 1))。树状数组主要有一下应用:求解树状数组,求前n项的和,当某个位置发生变化更新树状数组,获取某特定位原创 2017-03-28 20:30:24 · 296 阅读 · 0 评论 -
逆波兰表达式
一般我们在表达运算式时都用中序表达式,但是这样的表达方式并不适合机器来进行运算。以表达式1+2*3为例,计算机会将会解析这个表达式,然后递归求值。比如从左起顺序解析,符号树为: + / \1 * / \ 2 3计算机会递归的计算子树,直到根节点。这样空间和时间的消耗都很多。因此波兰数学家扬·武卡谢维奇提出了逆波兰表达式。逆波兰表达式的数字都在符号原创 2017-03-20 21:45:42 · 428 阅读 · 0 评论 -
FloodFill(泛洪算法)
泛洪算法图形处理中的一个填充算法,我们可以设想这样一个场景,windows的画图软件中的油漆桶为一个形状着色,该形状的范围内都将被着色,我们所使用的算法就是从一个像素点出发,以此向周边的像素点扩充着色,直到图形的边界。这个场景我们使用的算法就是flood fill(泛洪算法)。泛洪算法有3中不同的方式,每种算法有两种形式一种是递归的一种是非递归的。一般来说对于递归的算法我们比较容易实现,但是若原创 2017-01-09 22:12:50 · 11187 阅读 · 0 评论 -
The Skyline Problem解题报告
https://leetcode.com/problems/the-skyline-problem/这道题是根据数据对勾勒出数据的外形。数据的外形只和左边线和高度有关。因为数据已经按照左边线做了升序处理,所以我们不需要考虑序列的问题。外部的轮廓有所改变会出现两种情况:一是出现拐点,在一片相交连续的区域内有高度不同。二是出现空隔,空隔是将要开始扫描的左边线比已经存储右边线还要大,这时出现空隔。因原创 2016-12-20 14:20:53 · 425 阅读 · 0 评论 -
quickselect算法
quickselect算法是从一个无序数组里选择出第k小的元素,它和快速排序算法很像,因为作者都是同一个人==。该算法的时间复杂度为O(n)情况最差的时候时间复杂度为O(n2)快速选择算法借鉴快速排序算法,快速排序的算法如下:function partition(list,left,right,pivotIndex): pivotValue := list[pivotIndex]原创 2016-12-20 14:19:24 · 834 阅读 · 0 评论 -
Course Schedule解题报告
https://leetcode.com/problems/course-schedule/这道题是求图的拓扑排序。我们可以使用BFS和DFS的方法进行解决。使用BFS的方法我们首先找一个入度为0的点,将该点的入度置为-1以免重复访问。如果没有找到入度为0的点,说明有环,返回false然后将该节点的邻居的入度都减一。如果顺利结束返回true。class Solution {publi原创 2017-01-03 15:54:49 · 333 阅读 · 0 评论 -
trie树
字典树,顾名思义,像字典一样的树。从上面的图中,我们或多或少的可以发现一些好玩的特性。 第一:根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 第二:从根节点到某一节点,路径上经过的字符连接起来,就是该节点对应的字符串。 第三:每个单词的公共前缀作为一个字符节点保存。Tire树一般用来词频统计和前缀匹配。现在以211. A原创 2016-10-09 23:10:58 · 202 阅读 · 0 评论