论坛首页 招聘求职论坛

面试遇到大数据量的问题到底在考什么?

浏览 21575 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-03-18  
berlou 写道
感情你在玩文字游戏是不?你的上面上到哪?包括楼主说的所有的话么?这样重复的话, 是无限循环。
不要试图告诉我, 这个”上面“的断点是” A读文件一写入X数组写满A停止,B读取第二个文件写入Y数组写满B停止,这时候C启动,在X,Y两个数组找出交集,大小10000的两个数组怎么找交集这个大家自由发挥总之取到后写入另外个文件中,就当是文件三吧。“这句话中第一个逗号后面的部分, 你这个上也太会“上”了。即使以你这种“上”法, 也应该是“接着读A文件(如果没读过从头读)”, 才能使算法成立。
你要教人语文和语法, 就别弄出一个模棱两可的标准, 你要是上代表上面全部流程, 就把逗号前的带进去, 别以你的意思去断句。
拜托你还是省省, 别2b呵呵的在这现眼。


2你妹,你就傻b一个,跑来给小学语文老师丢脸
0 请登录后投票
   发表时间:2010-03-18  
lai008 写道
zhangdp_neu 写道
基本上考的是
数据结构和算法,而已有一定的技巧性。
推荐看一本《编程珠玑》
通过你的描述.
如果你的机器上int 为32位的话。

int max ,int min
先按无符号的数据来算吧,最大的值为4294967295 不到 43亿。


也就是可以说,去除重复后,文件中的整数不会超过43亿个。

43亿个整数 int 大小 4294967295 * 4B(每个int四个字节) 约等于
17179869180 B(字节)约等于16777215KB 约等于16383MB 约等于 16G


放入内存排序不要想了。

问题是找出最大的和最小的值。
那么,可以确定的是,最大值一定在 0-4294967295 之间。

如果定义一个数组int[4294967295]可以做的话,一个好的办法。
是用类似桶排序的原理。将对应的值扔到对应下标的数组里,如果有1233这个整数,就把下标1233的值设置为1.
那么最后一个不为空的位置 就是最大值,第一个不为空的就是最小值。
时间复杂度为 O(N),空间O(N),但是N太大,内存扛不住。
每个数组元素 取值只有1和0. 用Int型有些浪费了。用一个二进制位就可以表示了。

如果把int[4294967295] 型数组,每个元素大小缩小32倍。int 大小是32位,那么这个数组
可以表示为  bit[4294967295] 大小约等于4294967295/8 = 536870911B约等于534287KB约等于512M了.

那么别说是4G了,8G,100G也不会过这个范围。



算法描述如下
1bit = byte/8;

bit[4294967295] = init{0};

for(遍历文件)//可以批量读入提高性能。
{
取一个整数 X
        setBit(x);//将第x位值设置为1
}

//找出最大值
for(int i = 4294967295;i>=0;i--)
{
    if(bit[i]==1)return i;//i为最大值

}

//找出最小值
for(int int = 0; i <= 4294967295;i++)
{
    if(bit[i]==1)return i;//i为最小值

}

如果你觉得单线程处理不够快,那么就引入多线程。
把文件分割成N块(前提是你知道如何分割)如果分割不了,可以用两个线程首位读文件,两个指针相遇结束。
每个线程都执行 setBit(x)操作,并且不需要同步,但是多线程不一定可以提高性能啊。

如果是无符号数据的话,略微变形也可以解决。

第二个问题,也可以用类似方法解决,不过数组元素大小设置2bit就可以了。空间也不会超过1G的。

另外,如果不把数据读取内存中。

int max = 文件第一个int数据
int min = 文件第一个int数据
for(遍历文件)//可以批量读入提高性能。
{
   取一个元素X
   if(max<X)max = x;
   if(min>X)min = x;
}

print(max);
print(min);
这是 是你说的 第一个题的解法。


这样也可以解第一个问题。

第一题根本没有必要用位图法,因为只需要找到一个最大值和一个最小值(而不是前n个最大和最小),直接弄2个变量分别存最大值和最小,然后分批读入数据并比较就完了,只需遍历一次就够了,你这样做得话还有遍历2次,不太优,第二题也是用位图法求交集,至于你在写什么没太看懂



第二个,我描述的不清楚,不过前面已经有人描述过了,方法是相同的
lai008 写道

第二题:我的想法是先对2个集合排序,然后遍历一次求集合,排序复杂度是O(nlogn),遍历一次复杂度是O(n),总共大约是O(nlogN+n),不过还有更快的方法,都是整数的话,用位图法,一个位代表一个整数,2个集合就设置2个位图,读入数据,置相应的位图为1,全部读入后对2个位图做与操作,再读入每个位所代表的数据,复杂度是O(n)

0 请登录后投票
   发表时间:2010-03-18  
fanfq 写道
抛出异常的爱 写道
berlou 写道
Else 写道
就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊

它利用线程拙劣的方式就不说了, 连最基础最直观的错误算法都能贴出来让大家参观, 大家还客气什么?

说出来总比不懂装懂强多
这回不懂下回不就懂了?
PS:问题是问题
人品是人品
技术上的事不至于...



很多人心态有问题,就算LZ的不对,你加以指正并且说明你的想法好了。
实在有点看不下去了。以后还有人敢提问么?
谁不需要一个“脱菜”的过程啊。


非得你捧捧我,我鼓励鼓励你这样才是好的学术和技术氛围么?如果这样的话, 那真是和谐社会了。
互相挑刺笑骂比互相捧臭脚强多了。哪个牛逼产品不是在骂声中和指责声中长大的?
期望想婴儿宝宝一样受呵护, 能长大么?
0 请登录后投票
   发表时间:2010-03-18  
强强爱妍妍 写道
berlou 写道
感情你在玩文字游戏是不?你的上面上到哪?包括楼主说的所有的话么?这样重复的话, 是无限循环。
不要试图告诉我, 这个”上面“的断点是” A读文件一写入X数组写满A停止,B读取第二个文件写入Y数组写满B停止,这时候C启动,在X,Y两个数组找出交集,大小10000的两个数组怎么找交集这个大家自由发挥总之取到后写入另外个文件中,就当是文件三吧。“这句话中第一个逗号后面的部分, 你这个上也太会“上”了。即使以你这种“上”法, 也应该是“接着读A文件(如果没读过从头读)”, 才能使算法成立。
你要教人语文和语法, 就别弄出一个模棱两可的标准, 你要是上代表上面全部流程, 就把逗号前的带进去, 别以你的意思去断句。
拜托你还是省省, 别2b呵呵的在这现眼。


2你妹,你就傻b一个,跑来给小学语文老师丢脸


你这种人, 不给你一条一条摆出来就是嘴硬。
我们理理楼主的话。
1. 创建x, y两个数组
2. 读A文件写入x, 直到x满为止
3. 读B文件写入y, 直到y满为止
4. 找A和B的的交集,写入文件C
5. 清空y
6. 接着读B文件写入y(这里还有B结束的问题), 直到y满为止
7. 重复4,5的步骤知道执行6的时候B文件读完为止。
8. B文件读完后,清空x.
9. ???
到这,你个傻逼争论的地方来了, “重复上面的步骤”。
你告诉我从哪个步骤开始重复能达到算法预期效果?
从1还是从2还是从7?
如果不考虑时间和空间复杂度,这个算法想正确也只能是把7,8,9合并到2,3,4的步骤中。用语文描述就得是接着读文件A(如未读过则从头读), 接着读文件B(如未读过则从头读).....

真是属鸭子的。。。。
0 请登录后投票
   发表时间:2010-03-18  
berlou 写道

你这种人, 不给你一条一条摆出来就是嘴硬。
我们理理楼主的话。
1. 创建x, y两个数组
2. 读A文件写入x, 直到x满为止
3. 读B文件写入y, 直到y满为止
4. 找A和B的的交集,写入文件C
5. 清空y
6. 接着读B文件写入y(这里还有B结束的问题), 直到y满为止
7. 重复4,5的步骤知道执行6的时候B文件读完为止。
8. B文件读完后,清空x.
9. ???
到这,你个傻逼争论的地方来了, “重复上面的步骤”。
你告诉我从哪个步骤开始重复能达到算法预期效果?
从1还是从2还是从7?
如果不考虑时间和空间复杂度,这个算法想正确也只能是把7,8,9合并到2,3,4的步骤中。用语文描述就得是接着读文件A(如未读过则从头读), 接着读文件B(如未读过则从头读).....

真是属鸭子的。。。。


菜B菜B菜B 骂的就是你
你知道"接着读B文件",想不到接着读A文件?  死鸭子还给你
0 请登录后投票
   发表时间:2010-03-18  
berlou 写道
接着读B文件是楼主自己说的, 接着读A文件是你说的。
到此为止, 我不想再和你这种sb讨论, 拉低我智商。


原来你不仅语文不及格,还是盲人.
拿好你的放大镜照照,楼主哪里写了"接着读"三个字!
不要拿你弱智的脑子里的思路代替睿智者的思路
0 请登录后投票
   发表时间:2010-03-18  
强强爱妍妍 写道
berlou 写道
接着读B文件是楼主自己说的, 接着读A文件是你说的。
到此为止, 我不想再和你这种sb讨论, 拉低我智商。


原来你不仅语文不及格,还是盲人.
拿好你的放大镜照照,楼主哪里写了"接着读"三个字!
不要拿你弱智的脑子里的思路代替睿智者的思路



讨论问题结束了, 改对骂是吧?接着读这3字, 如果你瞎, 你可以Ctrl + F一下, 目前主流浏览器都支持。
如果你还是找不到, 可以用你这个算法, 把网页文件读出来, 匹配一下这3个字不是吗?
你眼睛长菊花上了?
0 请登录后投票
   发表时间:2010-03-18  
也难怪,你是盲人,用菊花观察世界是你这种sb才能想到的事情
0 请登录后投票
   发表时间:2010-03-18  
跟残疾人斗没意思,老夫下班去也
0 请登录后投票
   发表时间:2010-03-18  
bloom filter 也是一种思路
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics