Posts Tagged ‘computer science’
[zz]大数据量,海量数据 处理方法总结
大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。
下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。
1.Bloom filter
适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集
基本原理及要点:
对 于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这 个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。
还有一个比较重要的问题,如 何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况 下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应 该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。
举个例子我们假设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。
[zz]计算机算法和竞赛教材介绍
现在公认最好的入门书籍是“白书”《算法竞赛入门经典》(建议每位队员都应该要买这本书),之后应该就是《算法导论》和《算法艺术与信息学竞赛》了,另外《组合数学》和《离散数学》也是值得学习的,这个对训练逻辑思维、数学思维有很大的好处,比如东欧强队都非常注重这方面的训练,而国内注重的是算法训练。
关于题目的好书有:《ACM国际大学生程序设计竞赛题解(1) 》《ACM国际大学生程序设计竞赛题解(2)》《ACM国际大学生程序设计竞赛亚洲区预选赛真题题解》
关于OJ做题的好书有《挑战编程:程序设计竞赛训练手册》,另外一本国内的《程序设计导引及在线实践》
以下来自网络转载:
acm算法书籍收藏推荐
我常感叹到,学计算机的人是幸福的,因为在这个领域中有如此多的通俗易懂(相对来说)的经典好书,你需要做的只是坚持把它们一本一本读下去而已。学力学就没有这样的好事了(抱怨一下),除了论文就是论文,满篇公式,晦涩坚深,真不是给人看的(虽然我也没看过几篇)。在这里列出一些我看过或者准备看的算法书籍,以供参考。 |
[zz]APL — The God’s Language 上帝的编程语言
Before his life is done;
Write two lines in APL,
And make the buggers run.
每种程序语言都会吹嘘这门语言和其他语言在哪些方面上有多么多么不同,但是当你看到一个APL程序的时候,你会发现这尼玛才是真正的不同!一个APL程序根本就长得很怪异,像一些代数公式一样。当你想要写APL程序的时候,还需要准备一个专门的APL键盘,这种键盘长得下面这个样子:
[zz]UIUC某童鞋收集的代码合集,大赞啊!
https://netfiles.uiuc.edu/jbhuang1/www/resources/vision/index.html
Computer Vision Resources
Maintained by Jia-Bin Huang
Submit resource links here
Lastest Update: July 4, 2011
[zz]各大公司(Google,Microsoft,Baidu, Microsoft Research Asia etc.)实习生面试题总汇
from: http://blog.renren.com/share/228066793/6584972503
1.把二元查找树转变成排序的双向链表(树)
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
[zz]最大公约数(Gcd)两种算法(Euclid && Stein) [整理]
from: http://www.cnblogs.com/drizzlecrj/archive/2007/09/14/892340.html
很老的东东了,其实也没啥好整理的,网上很多资料了,就当备用把:-)
1. 欧几里德算法和扩展欧几里德算法
欧几里德算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a – kb,因此d|r
因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
[zz]深入学习算法的一点拙见
from: http://blog.csdn.net/midgard/archive/2009/04/16/4084884.aspx
今天实在是头脑不听使唤了,没力气看书,写代码了。写点总结吧。
都说算法是内功,究竟练到什么程度才算修成了呢?
为什么要学习,强化算法?
首先强调的是,下面的原因均是建立在算法熟练到一定程度后的效果。不熟的话,未见得能达到效果。这些原因很现实。但很多程序员却不知道或不以为然。
- 比较世俗的方面,顶级软件公司笔试,面试会问到。别说你不想去谷歌,百度,微软,如果真的没想过,我希望你能想想自己是否具备进入的实力。如果还是没兴趣想,那就忘了这条,看看下面的原因吧。
- 如果算法熟练,能显著提高看代码的速度,越是工作久了,越会发现很多时候是在读别人写的代码,然后在其基础上追加功能,或修改bug。所以这是很现实的技能。
- 算法操练上手快,注意只是快,但不见得容易。因为练习省去了界面等操作,只利用编译器最基本的功能,非常适合初学者,编程环境不十分熟练的人来学习,别小看这一点,这能让你不论在家,在同学的电脑上,甚至在网吧,只要你想操练都是能迅速找到办法写程序实现的。