锁定老帖子 主题:面试遇到大数据量的问题到底在考什么?
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-18
最后修改:2010-03-18
就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊
|
|
返回顶楼 | |
发表时间:2010-03-18
Else 写道 就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊
它利用线程拙劣的方式就不说了, 连最基础最直观的错误算法都能贴出来让大家参观, 大家还客气什么? |
|
返回顶楼 | |
发表时间:2010-03-18
大家不要嘲笑LZ了,其他的很多同学也不见得高明到哪儿去,还有写程序测试的呢.
这里是要找到理论上的算法方案,显然没有讨论到问题的点上去,不过有几位的思想很好 |
|
返回顶楼 | |
发表时间:2010-03-18
两个线程是顺序执行的,和单线程看不出有多大的区别。 楼主貌似没有说在重点上
|
|
返回顶楼 | |
发表时间:2010-03-18
berlou 写道 Else 写道 就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊
它利用线程拙劣的方式就不说了, 连最基础最直观的错误算法都能贴出来让大家参观, 大家还客气什么? 说出来总比不懂装懂强多 这回不懂下回不就懂了? PS:问题是问题 人品是人品 技术上的事不至于... |
|
返回顶楼 | |
发表时间:2010-03-18
抛出异常的爱 写道 berlou 写道 Else 写道 就算是人家lz错了,也不用这么挖苦人吧,这么搞,谁敢发贴讨论问题啊
它利用线程拙劣的方式就不说了, 连最基础最直观的错误算法都能贴出来让大家参观, 大家还客气什么? 说出来总比不懂装懂强多 这回不懂下回不就懂了? PS:问题是问题 人品是人品 技术上的事不至于... 人品问题见仁见智。 问题本身来讲, 需要思考。1个深度是10的问题, 你起码有3的思考, 楼主连2都到不了, 甚至简单1的思考就来指导大家一下, 这是误人子弟。 我指出的是他最基本的算法问题, 当作挖苦也好,当作啥都好,能谦虚接受才能进步。不用你来帮着维护。 |
|
返回顶楼 | |
发表时间:2010-03-18
两个解题思想都挺好的,但是不用依赖线程
|
|
返回顶楼 | |
发表时间: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次,不太优,第二题也是用位图法求交集,至于你在写什么没太看懂 |
|
返回顶楼 | |
发表时间:2010-03-18
第一个没看出哪用到多线程了,还不如一个线程去跑。
|
|
返回顶楼 | |
发表时间:2010-03-18
看到这里我囧了
我承认我一看下来基本哪个帖子也没看懂 |
|
返回顶楼 | |