论坛首页 招聘求职论坛

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

浏览 21625 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-03-18   最后修改:2010-03-18
就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊
0 请登录后投票
   发表时间:2010-03-18  
Else 写道
就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊



它利用线程拙劣的方式就不说了, 连最基础最直观的错误算法都能贴出来让大家参观, 大家还客气什么?
0 请登录后投票
   发表时间:2010-03-18  
大家不要嘲笑LZ了,其他的很多同学也不见得高明到哪儿去,还有写程序测试的呢.
这里是要找到理论上的算法方案,显然没有讨论到问题的点上去,不过有几位的思想很好
0 请登录后投票
   发表时间:2010-03-18  
两个线程是顺序执行的,和单线程看不出有多大的区别。 楼主貌似没有说在重点上
0 请登录后投票
   发表时间:2010-03-18  
berlou 写道
Else 写道
就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊

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

说出来总比不懂装懂强多
这回不懂下回不就懂了?
PS:问题是问题
人品是人品
技术上的事不至于...
0 请登录后投票
   发表时间:2010-03-18  
抛出异常的爱 写道
berlou 写道
Else 写道
就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊

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

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


人品问题见仁见智。
问题本身来讲, 需要思考。1个深度是10的问题, 你起码有3的思考, 楼主连2都到不了, 甚至简单1的思考就来指导大家一下, 这是误人子弟。
我指出的是他最基本的算法问题, 当作挖苦也好,当作啥都好,能谦虚接受才能进步。不用你来帮着维护。
0 请登录后投票
   发表时间:2010-03-18  
两个解题思想都挺好的,但是不用依赖线程
0 请登录后投票
   发表时间:2010-03-18  
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次,不太优,第二题也是用位图法求交集,至于你在写什么没太看懂
0 请登录后投票
   发表时间:2010-03-18  
第一个没看出哪用到多线程了,还不如一个线程去跑。
0 请登录后投票
   发表时间:2010-03-18  
看到这里我囧了

我承认我一看下来基本哪个帖子也没看懂
0 请登录后投票
论坛首页 招聘求职版

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