算法
文章平均质量分 76
我把葡萄酿成酒
吾日三省吾身
展开
-
如何正确的写出二分查找算法
查找届跟排序届不同,面试常用的算法就这么一种,二分查找。二分查找看似容易,其实写得完全正确还是挺难的,下面总结一下规律。一个普通的二分查找int search(vector& v,int target){ int left=0; int right=v.size()-1; while(left int mid=(left+right)/2原创 2015-01-02 12:02:15 · 760 阅读 · 0 评论 -
信号处理中数字增益的局限性
在信号处理领域,增益分为数字增益和模拟增益,数字增益用于操作离散的数字化的采样值,模拟增益直接操作连续的模拟的信号波形。对于目前大多数高端音响,都是采用模拟增益调整音量的,原因就在于数字增益有一些局限性。数字30, 003在16bit DAC中是这么表达的:0111010100110011 = 30,003对数字增益来说,调低音量是直接减少这个数字:比如调低-10db,而若20lo原创 2015-05-09 12:38:24 · 3992 阅读 · 0 评论 -
求大数阶乘算法
阶乘很好求,递归就行了,但对于较大的数,阶乘的结果非常非常大,木有办法,只能用string来处理。我们用string的乘法来做。经测试,这个程序能运行的最大n值差不多能到3000,和windows上自带的科学计算器差不多:)string multiply(string num1, string num2) { int len1 = num1.size(), len2 = n原创 2015-05-09 18:29:17 · 886 阅读 · 0 评论 -
理解广度优先搜索
1. 定义BFS是Breath First Search的缩写,是广度优先搜索的意思,是图的遍历方式的一种。由于BFS是从起点一层一层的进行搜索的,所以凡是需要求最短路径的问题,都可以尝试看BFS能否解决,比如Dijkstra的单源最短路径算法使用了BFS的思想。另外,在执行广度优先搜索的过程中将构造出一棵树,这也是Prim的最小生成树算法思想。在做BFS的时候,有两点需要特别注意原创 2015-05-30 21:11:03 · 1564 阅读 · 0 评论 -
【卡特兰数】有N对括号,输出所有合法的组合
这道题也算是很经典的了,属于一个基本原理题,深刻理解了这种题,也就理解了一大堆相似的问题。分析:n对括号,那么位置0出现的括号必然是“(”,和它配对的“)”可能出现在1,3,5,。。。。2n-1的位置上,设这个位置为2i+1, 则i的取值为从0到n-1.因此若假设C(2n)指的是2n个括号(n对)的所有可能合法组合的个数,以及和位置0的左括号配对的右括号出现在位置2i+1上时,合法组合原创 2015-01-02 12:00:54 · 9007 阅读 · 0 评论 -
推荐系统的基本原理
1. 推荐的种类a) 朋友推荐,这叫社会化推荐,通过社交网络搞定。比如你女朋友like的零食,通过人人网推荐给你,你想不买都不行。b) 推荐和自己喜欢的物品某种属性一致的物品,这叫基于内容的推荐。比如我喜欢宁浩的电影,以前在豆瓣上like了疯狂的石头,然后很快豆瓣就开始给我推荐《无人区》,我一看,比石头还好---好吧,夹带私货了。c) 把人和人喜欢的物品总和起来考虑,要么推荐和我相原创 2015-03-29 16:56:55 · 4220 阅读 · 1 评论 -
基尼系数的计算原理
理论基尼指数( Gini Index )是20世纪初经济学家基尼定义的指标,最为知名的应用是考察居民收入的差异情况。居民收入的情况符合幂指函数( Power Law )分布,最直观(但非准确)的理解就是 80/20 原则,也就是 20%的人拥有了 80% 的人的财富。用公式表示就是描述了是收入靠后 %x 的人所拥有的收入总和占所有人收入总和的比例 f(x) 的关系。原创 2015-03-22 22:07:46 · 6381 阅读 · 2 评论 -
MP3压缩算法
mp3也是有同步字的http://blog.csdn.net/sunnylgz/article/details/7615410MP3编码主要由3大功能模块组成,包括混合滤波器组(子带滤波器和MDCT),心理声学模型,量化编码(比特和比特因子分配和哈夫曼编码)。1. 混合滤波器组。这部分包括子带滤波器组和MDCT两部分。子带滤波器组编码完成样本信号从时域到频域的映射,并原创 2015-07-18 16:21:59 · 6471 阅读 · 0 评论 -
寻宝问题
琼斯博士在寻宝的过程中,来到了一个平面图呈矩形的封闭房间。矩形的宽度为w,高度为h。为方便描述,我们将矩形左上角坐标定为(0, 0),右下角坐标定为(w, h)。房间的入口在矩形上沿的中点(即(w/2, 0)),出口在矩形下沿的中点(即(w/2, h))。狡猾的魔王还放置了许多红外探测器,一旦进入探测器的探测半径以内,将触发警报。现在琼斯博士向您求助,他能否全身而退不惊动魔王?输入原创 2015-07-18 16:32:16 · 1428 阅读 · 0 评论 -
LRU算法
今天班车上读了池建强君的《每个人都该懂点缓存》,很佩服,能把艰涩的技术讲的如此生动,读起来还引人入胜,确实是一件非常厉害的事。作为一名程序员,我着重写一下文中提到的缓存的算法。原文链接如下:http://www.bubuko.com/news/detail-29818.html(由于首发是微信公共账号,所以web上全是转载)下面引用一段:常用的一些算法包括:FI原创 2015-08-26 22:42:47 · 543 阅读 · 0 评论 -
彻头彻尾的理解回溯算法
定义在程序设计中,有相当一类求一组解,或求全部解或求最优解的问题,例如读者熟悉的八皇后问题,不是根据某种特定的计算法则,而是利用试探和回溯的搜索技术求解。回溯法也是设计递归过程的一种重要方法,它的求解过程实质上是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中。---《数据结构》(严蔚敏)怎么理解这段话呢?首先,某种问题的解我们很难去找规律计算原创 2015-04-12 08:29:33 · 21497 阅读 · 3 评论 -
亲和数
一:什么是亲和数?亲和数问题最早是由毕达哥拉斯学派发现和研究的。他们在研究数字的规律的时候发现有以下性质特点的两个数:220的真因子是:1、2、4、5、10、11、20、22、44、55、110;284的真因子是:1、2、4、71、142。而这两个数恰恰等于对方的真因子各自加起来的和(sum[i]表示数i 的各个真因子的和),即220=1+2+4+71+142=,284=1原创 2015-01-03 10:17:42 · 1915 阅读 · 0 评论 -
PageRank算法原理
定义问题某网页 i 的PageRank 定义为上网者某一次点击鼠标到达网页 i 概率,记做 。比如,某网页的 PageRank 是0.000005 意味着一个人随机点击鼠标到达该网页的概率是 0.000005 。在网络世界里,对某一次点击来说,所有网页的 PageRank 之和为1 。建模网络世界中的各个节点可以表达成一幅巨大的有向图。如果节点原创 2015-03-22 19:35:31 · 1545 阅读 · 0 评论 -
求两个等长有序数组的中位数
设两个有序数组的长度均为n,求它们组成的2n长的数组的中位数。首先说明下中位数的定义:统计学名词,当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。中位数有个性质:在中位数两侧去掉任意数量的数后,中位数不变。为了简化,先假设n为奇数,那么A[n/2]是中位数,假设1. A[n/2]>B[n/2],那么A[原创 2015-01-02 12:00:57 · 1815 阅读 · 0 评论 -
【树】前序,中序,后序的非递归遍历
树其实是递归定义的,所以递归遍历树的方式也是比较自然的。但是因为种种原因---比如面试官想测你智商---你必须采用非递归的方法遍历树,那么请记住以下两个诀窍:1. 树的非递归遍历是对递归遍历的模仿,而怎么模仿递归呢?使用栈和循环2. 都只需要一个循环下面是code,都通过了leetcode的测试: 点击(此处)折叠原创 2015-01-02 12:00:49 · 389 阅读 · 0 评论 -
霍夫曼编码
什么是霍夫曼编码?简单的说,就是把被编码的对象按照出现概率高低排序,使出现概率高的尽量占用bit少一些,这样使整体编码结果较小。wiki上有这么个例子:在英文中,e的出現機率最高,而z的出現概率則最低。當利用霍夫曼編碼對一篇英文進行壓縮時,e極有可能用一個位元來表示,而z則可能花去25個位元(不是26)。用普通的表示方法時,每個英文字母均占用一個字節(byte),即8個位元。二原创 2015-01-02 12:00:18 · 954 阅读 · 1 评论 -
单链表相关
问题一:逆序,相当简单的一道题思路:双指针node * linklistreverse(node * header){ node * p1=header; node * p2=NULL; if(p1!=NULL){ p2=p1->next; p1->next=NULL; while(p2!=NULL){ node * tmp = p2->next; p2->next=p原创 2015-01-02 19:31:45 · 514 阅读 · 0 评论 -
【树】层序遍历
层序遍历不是按照父子关系方式遍历,而是采用兄弟关系遍历,因此不能采用递归的方式来做。树的定义里只能从父亲找孩子,因此需要把父亲存起来,这样才能把一堆互为兄弟的孩子遍历到,所以要使用队列,FIFO的那种。 点击(此处)折叠或打开 vectorvectorint> > levelOrder(TreeNode *r原创 2015-01-02 12:00:51 · 458 阅读 · 0 评论 -
如何计算时间复杂度?
时间复杂度说白了就是运行一个算法需要消耗多少CPU指令周期,但是这个计算非常受到软硬件环境的影响,比如A=A+B;如果A是32位数,B也是32位数,所在的环境是32位机,这句话只需要1个指令周期即可完成。但是如果A是64位数,B也是64位数,环境是32位机,这句话需要6个指令周期才能完成。另一方面,对于稍微复杂一点的程序,精确计算CPU指令周期几乎是个不可能的,所以我们需要简化它。原创 2015-01-03 13:53:14 · 1328 阅读 · 0 评论 -
走棋盘相关的一系列问题
问题一:给定m*n的矩阵,从左上角开始,每次只能朝右和下走,走到右下角,问有多少种走法?思路:其实就是在m+n步中选择m步向下的和n步向右的,所以就是C(m+n,m) 或C(m+n,n),这两者一样问题二:给定m*n的矩阵,每个位置是一个非负整数,从左上角开始,每次只能朝右和下走,走到右下角,求最小的路径和。思路:动态规划,每个节点只能来自上边和左边,所以很容易想出原创 2015-01-05 21:47:09 · 1119 阅读 · 0 评论 -
堆的使用
堆不同于Heap,在算法中,它是一种数据结构。它存储成数组,逻辑上可以看做一个近似的完全二叉树。最大堆的性质:父节点的值大于等于子节点的值。最小堆的性质:父节点的值小于等于子节点的值。下面都是基于最大堆讨论:1. 给定一个无序数组A,维护第i个元素堆的性质算法可表示为:MAX_HEAPITY(A, i){l=LEFT(i)r=RIGHT(i)if(l原创 2015-01-02 17:44:37 · 489 阅读 · 0 评论 -
关于树的一些基本算法
树是一种递归定义的数据结构,也是一种无向无环图。树的非递归遍历中序遍历vector inorderTraversal(TreeNode* root) { vector result; if(root==NULL) return result;; stack s; s.push(root); TreeNo原创 2015-08-20 22:50:29 · 517 阅读 · 0 评论