
数据结构与算法
文章平均质量分 92
yutianzuijin
目前从事端到端语音大模型落地相关的工作。
展开
-
蓄水池抽样算法
最近面试字节,被面试官问到一个这样的问题:给定一个超大的文件,从该文件中随机选取k行文本出来,使得每一行被选择的概率相等。当时一脸懵,后来了解到这个问题需要通过蓄水池抽样算法来解决,经过两天的学习大概搞明白了算法原理,简单记录一下。...............原创 2022-07-07 11:34:05 · 473 阅读 · 1 评论 -
arpa2fst 原理详解
在基于 wfst 的语音识别中,需要将 HCLG 四个不同层次的模型复合(composition)在一起构成一个超大的解码网络,其中的 G 即是语言模型的 WFST表示。但是我们常见的语言模型并不是以 WFST 形式存在的,而是基于 ngram 实现的,通常以 arpa 文件形式存在。所以复合的第一步就是将 arpa 文件转为 wfst,在 kaldi 中以 arpa2fst 脚本形式存在,我们在此原创 2017-12-08 22:15:26 · 9027 阅读 · 9 评论 -
语音识别中的lattice与confusion network
如果大家使用搜狗输入法的语音识别可能会发现在我们说我一句话之后,语音识别会返给你多个结果,这些结果之间只有微小差异(很多时候是发音相同的替代词)。绝大多数时候,输入法给出的结果就是我们需要的,但是偶尔也会出现候选结果中的才是我们需要的。你可能会好奇这些候选结果是如何产生的,在本文中我就给大家简单介绍一下。one best最初的语音识别结果只有一个,也被称为one best,即一个最优结果。语音识别解原创 2017-08-27 17:05:52 · 12477 阅读 · 7 评论 -
大页内存(HugePages)在通用程序优化中的应用
今天给大家介绍一种比较新奇的程序性能优化方法—大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表缺失。这方面的资料比较贫乏,而且网上绝大多数资料都是介绍它在Oracle数据库中的应用,这会让人产生一种错觉:这种技术只能在Oracle数据库中应用。但其实,大页内存可以算是一种非常通用的优化技术,应用范围很广,针对不同的应用程序,最多可能会带来50%的性能提升原创 2014-12-13 20:04:04 · 29082 阅读 · 7 评论 -
流式数据中的数学统计量计算
在科技飞速发展的今天,每天都会产生大量新数据,例如银行交易记录,卫星飞行记录,网页点击信息,用户日志等。为了充分利用这些数据,我们需要对数据进行分析。在数据分析领域,很重要的一块内容是流式数据分析。流式数据,也即数据是实时到达的,无法一次性获得所有数据。通常情况下我们需要对其进行分批处理或者以滑动窗口的形式进行处理。分批处理也即每次处理的数据之间没有交集,此时需要考虑的问题是吞吐量和批处理的大小。滑原创 2017-07-03 22:38:04 · 6825 阅读 · 0 评论 -
leetcode之Find All Numbers Disappeared in an Array
问题来源:Find All Numbers Disappeared in an Array 很久没有刷题了,感觉大脑开始迟钝,所以决定重拾刷题的乐趣。一开始不要太难,选一些通过率高的题目做,然后就看到了这个题目。我有些吃惊,这个题我虽然知道两种解法,但本身还是有难度的,居然通过率这么高。然后就搜索相关网页,看到一个和它很接近的题目《Find All Duplicates in an Array》,原创 2016-12-24 18:21:10 · 10710 阅读 · 0 评论 -
链表的替代品—内存池
链表是大家非常熟悉的数据结构,使用频率也非常高,但是链表有几个缺点。首先,我们每创建一个节点,都要进行一下系统调用分配一块空间,这会浪费一点时间;其次,由于创建节点的时间不固定,会导致节点分配的空间不连续,容易形成离散的内存碎片;最后,由于内存不连续,所以链表的局部访问性较差,容易出现cache缺失。 针对链表的上述问题,在实际工作中,我们很少直接用链表,而是采用链表的替代品—内存池。上过原创 2016-11-27 19:06:16 · 2753 阅读 · 0 评论 -
leetcode之Largest Rectangle in Histogram
问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积。例如,给定下述直方图,我们 可以以高度5宽度2画一个更大的长方形,如下图,该长方形即是面积最大的长方形。 该问题是难度比较大的问题,但是很出名,经常作为面试题出现。最近陈利人老师给出该问题的一个O(n)原创 2016-07-30 13:47:33 · 9164 阅读 · 0 评论 -
基于递归分割的迷宫生成算法与自动寻路
代码下载:基于递归分割的迷宫生成算法与自动寻路 今天给大家介绍一个图形学里的东西—迷宫的生成算法。迷宫的生成算法有很多种,比如基于深度优先和广度优先的生成算法,在此介绍另外一种方法,基于递归分割的迷宫生成算法。网上大部分迷宫生成算法生成的迷宫墙壁都是线条,本文生成的迷宫墙壁是正方形,先给大家看个示例: 下面就开始正式介绍基于递归分割的迷宫生成算法。1. 生成迷宫在生成迷宫之前,我们需要先确定原创 2016-07-31 14:06:43 · 20574 阅读 · 12 评论 -
区间调度问题详解
今天给大家介绍一下区间调度问题。区间调度是一类难度比较大,但同时应用比较广的问题,经常会在面试中以各种形式出现。本文将会介绍区间调度的各种变形,希望能使大家在面临区间调度问题时得心应手,并可以在实际工作中巧妙应用。1. 相关定义在数学里,区间通常是指这样的一类实数集合:如果x和y是两个在集合里的数,那么,任何x和y之间的数也属于该集合。区间有开闭之分,例如(1,2)和[1,2]的表示范围不同,后者包原创 2017-12-25 22:25:59 · 10346 阅读 · 2 评论 -
最小化曼哈顿距离
曼哈顿距离曼哈顿距离和欧式距离一样是一种距离度量标准,不同的是它定义在L1范数下,也即用绝对值来衡量两点之间的距离。在一维空间下,曼哈顿距离定义如下:d(x,y)=∣x−y∣d(x,y)=|x-y|d(x,y)=∣x−y∣在二维空间下,曼哈顿距离定义如下:d(x,y)=∣x1−y1∣+∣x2−y2∣d(x,y)=|x_1-y_1|+|x_2-y_2|d(x,y)=∣x1−y1∣+∣x2...原创 2019-07-07 18:10:30 · 13467 阅读 · 3 评论 -
cblas_sgemm和cublasSgemm参数详解
机器学习最核心的底层运算肯定是矩阵乘法无疑了,为了让矩阵乘法执行更快,大家也是绞尽脑汁。从算法层面,stranssen算法将矩阵乘法复杂度由O(n3)O(n^3)O(n3)降到O(n2.81)O(n^{2.81})O(n2.81),最新的算法好像已经降到O(n2.37)O(n^{2.37})O(n2.37)左右了(Coppersmith–Winograd algorithm),但这只是理论复杂度,...原创 2019-05-21 17:42:30 · 11172 阅读 · 1 评论 -
leetcode 之 Merge k Sorted Lists
问题来源:Merge k Sorted Lists该问题是一个很经典的问题,给定k个有序链表将其合并成1个有序链表。很多人应该在实际的面试中遇到过该问题(至少我会经常问面试者该问题,因为接着可以问堆相关的算法~)。为啥要针对该经典问题写篇博客呢,是因为该问题确实会在日常工作中出现,但是却很少有人想到用优化的算法来解决该问题。我们先看一下该问题的两种优化解法。解法一最常用的方法是利用最小堆(链...原创 2019-03-16 15:27:17 · 1884 阅读 · 0 评论 -
利用二级指针进行链表操作
Linus曾经在网上吐槽很多程序员不会写真正的底层核心代码,并用简单的单链表删除举例。常规的链表删除除了当前的遍历指针还需要维护一个prev指针,用来连接被删除节点的下一个节点,但实际上利用二级指针就可以避免多维护一个指针,使代码更加简洁。Linus的吐槽没错,到目前为止,我几乎没有在实际工作中看到过用二级指针进行链表删除的相关代码,除了各种网页中对Linus描述的解释。二级指针不光能够简化链表的...原创 2018-10-19 10:27:38 · 6767 阅读 · 6 评论 -
利用ARM NEON intrinsic优化常用数学运算
ARM NEON是arm平台下的SIMD指令集,利用好这些指令可以使程序获得很大的速度提升。不过对很多人来说,直接利用汇编指令优化代码难度较大,这时就可以利用ARM NEON intrinsic指令,它是底层汇编指令的封装,不需要用户考虑底层寄存器的分配,但同时又可以达到原始汇编指令的性能。 所有的intrinsic指令可以参考博客《ARM Neon Intrinsics各函数介绍》,本...原创 2018-04-14 21:13:41 · 14869 阅读 · 5 评论 -
快速浮点开方运算
代码下载:开根号的几种算法实现 在之前的博客中我们介绍了数据类型的地址转换,利用它我们可以将一个float型的值直接看成一个int类型。这种地址转换到底有什么意义,或者说有什么用途呢?今天,给大家展示一个实例—快速浮点开方运算,让大家更加明白地址转换的含义和它们之间的对应关系。1 二分法浮点开方也就是给定一个浮点数x,求x√\sqrt x。这个简单的问题有很多解,我们从最简单最容易想到的二分开始讲原创 2017-12-19 10:35:16 · 18519 阅读 · 8 评论 -
利用辛达拉姆筛进行素数判定
1 常规判定方法 素数判定问题就是对给定的正整数n判定是否为素数。所谓素数,是指恰好有2个约数的整数。因为n的约数都不超过n,所以只需要检查2~n-1的所有整数是否整除n就能判定是不是素数。不过,我们还能进一步优化。如果d是n的约数,那么n/d也是n的约数。由n=d*n/d可知min(d,n/d),所以只需要检查2~的所有整数就足够了。此时,素数判定的复杂度为O()。代码实现如下:原创 2014-07-06 21:09:52 · 4141 阅读 · 4 评论 -
无锁队列的实现
无锁队列的实现耗子叔曾经写过一篇同名的博客,主要参考了John D. Valois 1994年10月在拉斯维加斯的并行和分布式系统国际大会上的一篇论文——《Implementing Lock-Free Queues》。但是从目前现状来看,这篇论文中提到的算法是有问题的,并没有在实际中被采用。现在被广泛采用的无锁队列实现都是基于Maged M. Michael和Michael L. Scott 95年原创 2016-06-12 22:42:05 · 9620 阅读 · 5 评论 -
《An Introduction to Signal Smoothing》译文
最近在做数据平滑相关的工作,正好读到该篇博客,感觉不错,就翻译了一下。原链接:An Introduction to Signal Smoothing信号平滑简介噪声无处不在,不管是在采集手机游戏的加速度数据还是在测量房间的温度,都会引入误差。即使我们有能力消除所有的误差,测量的结果依旧包含一定程度的不确定性。假如玩家随意点击了一下手机屏幕,他们到底想点击哪里是不确定的。所有这些问题都强迫我们重新思考翻译 2016-06-28 22:22:41 · 2012 阅读 · 0 评论 -
深入理解快速排序算法的稳定性
在初次接触排序算法稳定性这个概念时,我一直认为复杂度为O(n2)的算法是稳定的,复杂度为O(nlogn)的算法是不稳定的。当时是这样理解的,复杂度为O(n2)的算法不可能再坏,而复杂度为O(nlogn)的算法在极端情况下可能会退化为O(n2),例如快速排序。但其实这是错误的,稳定性的概念远没有这么复杂,它只表示两个值相同的元素在排序前后是否有位置变化。如果前后位置变化,则排序算法是稳定的,否则是不原创 2014-04-30 11:30:06 · 23249 阅读 · 5 评论 -
二维直方图盛水
转载自:数组墙分析数组墙分析原题给定一个正整数数组如[2,5,1,2,3,4,7,7,6],数组中每个数代表一个墙的高度,如图,问:往墙里倒水,墙之间的水坑总共可以装多少水呢?分析题目中的例子,可以装水的示意图如下:木桶短板理论:一只木桶盛水的多少,并不取决于桶壁上最高的那块木块,而恰恰取决于桶壁上最短的那块。此问题同转载 2013-11-20 23:45:23 · 5055 阅读 · 0 评论 -
集合元素的排列与子集
一、 集合的排列 给定一个集合S,含有n个不重复的元素,输出该集合元素的所有排列,leetcode对应题目为:http://oj.leetcode.com/problems/permutations/。打印所有排列的复杂度为O(n*n!),因为共有n!个不同的排列,打印每个排列的复杂度为O(n)。打印所有的排列一般采用深搜策略,先给出一个常规的方法:vo原创 2013-10-26 22:28:56 · 6226 阅读 · 0 评论 -
分数化小数
《编程之美》有一个题是给定一个小数,将其转化成最简分数,思路比较简单,首先将小数转化成分数,然后对分数化简。如果将问题倒过来,给定一个分数(N/D),将其转化成对应的小数,这该如何做?我们先分析一下分数转化成小数的可能情况:1)小数是一个有限小数(0.abc…d);2)小数是纯循环小数(0.);3)小数是非纯循环小数(0.ab…c)。分数不可能产生无限不循环小数。第一种情况无需特殊考虑,只需要原创 2013-10-12 20:27:13 · 12400 阅读 · 0 评论 -
《挑战程序设计竞赛》 读后感
最近要开始准备面试找工作,算法是准备的重中之重,舍友推荐了《挑战程序设计竞赛》这本书。花了一周的时间大体过了一遍,该书真切地让我理解了“智商是硬伤”这句话的含义。我对它的评价是:如果智商小于120,只看前两章就够了;智商大于120小于150,三四章的简单章节还是可以看一下的;智商大于150,看完本书问题不大。望大家量力而为,否则你的自信心会遭受严重的打击。下面把自己看懂的,并感觉比较重要的内容原创 2013-09-12 21:35:26 · 26364 阅读 · 12 评论 -
leetcode难度及面试频率
转载自:LeetCode Question Difficulty Distribution 1Two Sum25arraysort setTwo Pointers转载 2013-09-09 14:44:07 · 116307 阅读 · 9 评论 -
《编程之美》2.21 只考加法的面试题
网上存在很多对该问题的解答,但是很多解答都有错误,比较正确的是http://blog.youkuaiyun.com/lyso1/article/details/5399146,但是问题解法较为复杂,在此将从另一个思路对问题进行解答,很大程度简化了算法正确性的证明。------------------------------------------------------------------------原创 2013-08-25 13:58:39 · 8000 阅读 · 5 评论 -
最长等差数列分析
转载自:最长等差数列分析原题给定未排序的数组,请给出方法找到最长的等差数列。分析题目描述比较简单,但是有一个问题我们需要首先搞清楚:等差数列中的数字,是否要和原始数组中的顺序一致。题目中,并没有说明,这个就需要大家在面试的过程中和面试官进行交流。我们在这里对两种情况都进行讨论:保证数字的顺序等差数列是要求相邻两个元素之间的差是相同的。转载 2013-09-07 13:17:29 · 7268 阅读 · 0 评论 -
2012百度之星初赛第一场B题
小弟新手,只尝试了B题,还各种bug。改过之后的代码是:#include long long pow(long long x){ long long a=10; while(x/a!=0) { a*=10; } return a;}int main(){ int n,i,s=0; long long x,a,b,p; scanf("%d",&n); for原创 2012-06-02 17:04:40 · 1800 阅读 · 0 评论 -
leetcode之 Palindrome Partitioning I&II
1 Palindrome Partitioning问题来源:PalindromePartitioning该问题简单来说就是给定一个字符串,将字符串分成多个部分,满足每一部分都是回文串,请输出所有可能的情况。 该问题的难度比较大,很可能第一次遇到没有思路,这很正常。下面我们一点点分析,逐步理清思路。先不考虑所有的情况,针对一个符合条件的划分,每一部分都是一个回文子串,而且原创 2013-11-20 21:06:00 · 16176 阅读 · 20 评论 -
《Tips for Optimizing C/C++ Code》译文
前不久在微博上看到一篇很好的短文讲如何对C/C++进行性能优化,虽然其面向的领域是图形学中的光线跟踪,但是还是具有普遍的意义,将其翻译成中文,希望对大家写高质量代码有帮助。1. 牢记阿姆达尔定律:加速比==其中表示函数func运行时间占总时间的百分比,表示对该函数加速获得的加速比。例如,你优化一个函数TriangleIntersect(),该函数的运行时间占总时间的翻译 2014-05-19 23:05:07 · 3811 阅读 · 1 评论 -
最左侧1问题
今天给大家介绍一个有趣的位运算题目,叫最左侧1问题,英文名叫count leading zeros或most significant bits problem。问题比较好理解,就是给定一个整数,然后看最左侧的1出现在什么位置,等价于寻找整数的最高有效位或者前置零的个数。比如,0x128只有一个1,从右侧遍历1出现在第7位(从0开始计数)。我们给出几种不同的解法。以下解法返回的均是从右侧遍历的位置。原创 2016-03-05 12:45:02 · 5916 阅读 · 4 评论 -
leetcode 之 Single Number II
问题来源:Single Number II 问题描述:给定一个整数数组,除了一个整数出现一次之外,其余的每一个整数均出现三次,请找出这个出现一次的整数。 大家可能很熟悉另一个题目(SingleNumber):除了一个数出现一次之外,其余的均出现两次,找到出现一次的数。该问题很简单,大家肯定都知道解法:将所有的数异或,最后的结果即是出现一次的数。用到的知识是A^A=0,原创 2016-01-28 00:20:22 · 8010 阅读 · 13 评论 -
《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文
NMF(非负矩阵分解),由于其分解出的矩阵是非负的,在一些实际问题中具有非常好的解释,因此用途很广。在此,我给大家介绍一下NMF在多声部音乐中的应用。要翻译的论文是利用NMF转录多声部音乐的开山之作,浅显易懂地介绍了如何利用NMF对钢琴曲进行乐谱翻译,值得一看。摘要 在本文中我们提出一种新方法用来分析由固定谐波格式的音符构成的复调乐曲片段(例如钢琴音符)。由于音符结构固翻译 2015-12-30 20:19:41 · 4053 阅读 · 1 评论 -
KMP算法详解
kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚。在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚。kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历原创 2013-09-24 00:02:35 · 262455 阅读 · 79 评论 -
编辑距离
1. 编辑距离定义 今天我们来研究一个有趣的算法题,叫做字符串编辑距离。编辑距离研究的问题和最长公共子序列有相似之处,都是比较两个字符串之间的相似性,只是采用的标准不太相同。 先给出编辑距离的定义:设A和B是2个字符串,要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括: (1)删除一个字符(delete); (2)插原创 2015-12-12 10:48:13 · 14862 阅读 · 5 评论 -
缺失的数字分析
题目:给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。比如[1,2,0]返回 3, [3,4,-1,1]返回 2。最好能O(1)空间和O(n)时间。该题在缺失的数字分析上有解答,但是感觉讲得不清楚,下面按照我的理解重新解释一下算法步骤。 首先,给定的整数数组可能包含负数,而且正数的范围也可以超过n,所以最普遍的情况应该如下:3原创 2013-09-13 11:03:38 · 3543 阅读 · 0 评论 -
数组统计分析
转载自:数组统计分析给定数组A,大小为n,数组元素为1到n的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计哪些数字没有出现,哪些数字出现了多少次。能够在O(n)的时间复杂度,O(1)的空间复杂度要求下完成么?分析这个题目,是有一定技巧的。技巧是需要慢慢积累,待经验多了之后,可以灵感或者直觉,就产生了技巧。如果不知道技巧,那该怎么办呢?转载 2013-08-29 13:57:40 · 3011 阅读 · 0 评论 -
基数排序的性能优化
最近需要对大小在0到100万内的很多数组进行排序,每一个数组的长度都不固定,短则几十,长则几千。为了最快完成排序,需要将数组大小和数据范围考虑进去。由于快速排序是常规排序中速度最快的,首选肯定是它。但是数组中数据的范围固定,可以考虑基数排序。为了使排序耗时尽可能短,需要测试这两种排序算法。快排是面试过程中常考的手写代码,需要背得滚瓜烂熟,代码如下:void swap(int* a,int原创 2014-04-03 16:00:58 · 9232 阅读 · 6 评论 -
数组统计分析的另一种方法
给定数组A,大小为n,数组元素为1到n的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计哪些数字没有出现,哪些数字出现了多少次。能够在O(n)的时间复杂度,O(1)的空间复杂度要求下完成么?该问题来源于:数组统计分析,文中给出的方法非常巧妙,通过简单的整除性质解决了该问题:第一次遍历将每一个位置加上k倍的n,然后第二次遍历将每一个位置除以n即得每个整数出现的次数k。该方法原创 2013-09-08 16:12:14 · 5155 阅读 · 1 评论