
算法
夕阳那边
这个作者很懒,什么都没留下…
展开
-
大数据处理问题
topK问题topK算法就是给出一堆数,在里面找出最大、最常出现的等一系列问题。 topK算法(常考) 方法1:K大小的数组存topK 维护一个K大小的排序数组,每次都和最后一个元素比较,如果比最后一个元素大的话,那么就把这个元素插入到排序数组中。因为元素的每个移动的次数可能是K,时间复杂度O(N*K) 方法2:K大小的堆存topK 维护一个K大小的小顶堆,每次都和堆最上面的元素作比较,如原创 2016-06-21 09:24:47 · 659 阅读 · 0 评论 -
倒排索引
转自 wiki百科:比如说,现在有这些文章以及文章中含有的单词 以英文为例,下面是要被索引的文本:文本0 - "it is what it is"文本1 - "what is it"文本2 - "it is a banana"我们就能得到下面的反向文件索引: "a": {2} "banana": {2} "is": {0, 1,原创 2016-05-13 17:30:19 · 437 阅读 · 1 评论 -
暴雪hash来作整数的hash
暴雪hash来作整数的hash我们常常在项目中会用到探测一个数组B中是不是有数组A中的数据。 方案1:将B中的数据放到一个位图中,然后用A中的数据探测。 缺点:如果B中的数据比较稀疏,比如[1,2,900,800]等,位图开销大,因为要为没有出现的数也需要有一个bit来标识。 方案2:将B中的数据存到一个hash表中,然后用A中的数据作探测。 暴雪hash的原理见我之前转载的文章暴雪hash原创 2016-06-16 17:06:52 · 689 阅读 · 0 评论 -
暴雪hash
暴雪的hash转载自:http://www.biaodianfu.com/blizzard-hash.html暴雪公司的魔兽、星际等游戏都一样一个非常大的MPQ文件,该文件存储了游戏中的大部分数据,想要把这些文字找出来,简单的办法是从数组头开始,一个个字符串读过去,比较每一个,直到找到对应的内容。Blizzard的天才和牛人们当然不会这样做,他们用了更聪明的方法: 用某种算法,把一个字符串压缩成一个转载 2016-06-13 23:32:22 · 713 阅读 · 0 评论 -
动态规划-背包问题降维以及衍生的硬币问题
任何动态规划核心就是划分子问题,然后就是状态转移方程。中间求出来的子问题的解需要存储起来。0-1 背包问题:0-1 背包问题解决的是物品只能够选择1次要不就不选,在背包能够装得下的前提下面,能够保证装的价值最大:状态转移方程 f[i][j] = max{ f[i-1][j] , f[i-1][j - wi] +vi }; 0≤j - wi≤j用二维的空间来表示是比较简单的一维表原创 2016-06-08 11:20:23 · 799 阅读 · 0 评论 -
需要手写的算法之----------快速排序的排序的列子
int Partion(vector &vec , int begin , int end ){ if(begin == end ){ return begin; } if(begin vec.size() - 1){ cout<<"ERROR"; return -1; } int tmp = vec[begin]; while (begin < end ){ wh原创 2016-04-21 10:40:17 · 963 阅读 · 1 评论 -
List 的选择排序
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *in原创 2016-05-31 20:28:01 · 560 阅读 · 0 评论 -
需要手写的算法之---------------归并排序
这里只是给出二路归并归并的思想是,将要排序的区间里面的数据分成两个部分,然后分别对他们进行二路归并,最小的粒度是当两个区间的数据都是只有一个,或者有一个没有的时候。具体的代码如下:http://blog.youkuaiyun.com/morewindows/article/details/6678165/转载 2016-05-08 15:57:11 · 554 阅读 · 0 评论 -
最长子序列问题(时间复杂度O(nlog(n))
问题:10 , 9 , 8 , 1, 2, 5 ,3,最长子序列是 1, 2, 5。最长子序列长度是3。思路:用一个数组表示当前的最长的子序列,在接下来新增加的元素中,找到这个子序列中某个可以被新的值替换的位置,这个位置要满足被新的值替换后,依然保证数组中保存的是最长的子序列,并且在此基础上可以有更多的值并入这个数组code:class Solution { public:原创 2016-05-07 21:06:27 · 504 阅读 · 0 评论 -
对链表进行排序
对链表进行排序:参考的思路是来自于这位“哥们 ”https://leetcode.com/discuss/92326/share-my-c-concise-solutions-easy-to-understand/** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2016-05-31 14:41:32 · 802 阅读 · 0 评论 -
N个加油站问题
问题:城市的环形路有n个加油站,第i个加油站的油量用gas[i]来表示,你有如下的一辆车:它的油缸是无限量的,初始是空的它从第i个加油站到第i+1个加油站消耗油量为cost[i]现在你可以从任意加油站开始,路过加油站可以不断的加油,问是否能够走完环形路。如果可以返回开始加油站的编号,如果不可以返回-1。https://leetcode.com/problems/ga原创 2016-05-07 13:41:17 · 1332 阅读 · 0 评论 -
统计1到N之间所有数字中1的个数
本文中的code和思想来自于https://leetcode.com/discuss/44281/4-lines-o-log-n-c-java-python ,感谢作者code如下:int countDigitOne(int n) { int ones = 0; for (long long m = 1; m <= n; m *= 10) { int a =翻译 2016-04-27 10:47:26 · 4073 阅读 · 0 评论 -
快速排序算法的时间复杂度为什么是O(NlogN),还有O(N^2)
转载自:http://www.cnblogs.com/pugang/archive/2012/07/02/2573075.html经常听人谈起各种排序算法的时间复杂度,这个是O(n2)的,那个是O(n)的,这些人讲起来可谓滔滔不绝,但是你停下来问问他为什么这个是这个复杂度,他是怎么算出来的?往往没几个人能说出来。这个是一个浮躁的社会,大家都追求速度,到处复制,粘贴代码,拿人家的代码跑一转载 2016-04-15 15:37:48 · 16502 阅读 · 0 评论 -
最小编辑距离
问题:Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)You have the following 3 operations permitted on a wo原创 2016-04-26 11:22:31 · 287 阅读 · 0 评论 -
找到一个数的质因子
如果像博主一样第一次写出判断一个数是不是质数的函数,那这个解法就比较out了so。。。真正的解法是:int main(){int num ;cin >> num;int tmp = num ;for(int i = 2 ; i {while( tmp % i == 0){couttmp /= i; }}}可以这样写的原因大概也是一目了原创 2016-04-13 17:14:07 · 1360 阅读 · 0 评论 -
字符串的排列组合
class Solution { public: void change(string str , size_t index){ if(index == str.length()){ set_.insert(str); return; } for(size_t i = index ;原创 2016-04-07 17:32:41 · 271 阅读 · 0 评论 -
稀疏矩阵的设计问题
稀疏存储 设计一个结构存取稀疏矩阵 (面试官最后告诉我了一个极度压缩的存法,相同行或列存偏差?) 稀疏存储有以下 几个方法, 参考文章:稀疏矩阵的几种存取方法 方法1:用三个一维向量存。 方法2:用列和行偏移量的方式来存。 方法3:对于那种值在对角线上面的情况,可以存储的是对角线上面的元素+偏移量的方式来存。 方法4: 方法5:原创 2016-06-21 09:34:10 · 829 阅读 · 0 评论