锁定老帖子 主题:面试遇到大数据量的问题到底在考什么?
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-16
他是考验你算法?会不会遍历?集合的使用?还是考验计算机内存大小的?我感觉都不是,是在考你思路。前面有人发表了“两个1000W个元素的数组,如何有效的找出他们的交集”,等会我说下思路,对的话大家顶下,谢谢。 先说我以前我也遇到过一道类似的题,4G大小的文件,里面全部是整数,求出最大,最小值。别告诉我拿8G内存的计算机用数组存储,然后遍历,比较。。。如果人家说8G的文件呢?16G的文件呢?当时我第一反应是把4G文件分开,但是后来马上想到的是多线程,最后说出了思路,描述如下: A,B两个线程 定义两个变量int max,min; 一个int数组,大小任意(决定大小的因素,计算机,语言等因素,这里不详细说了),例如大小10000的数组X A读取文件写入X,写满A暂停,B启动在数组X种找到最大最小分别赋值给变量max,min 遍历完后清空X,暂停B,然后启动A同样是读取文件,写入数组,之后暂停A,遍历和max,min比较,遍历完最大和最小值分别赋值给变量max和min 重复操作,直到全部读取比较完,结束。 这只是个思路,其中多线程的操作和IO等操作不做详细说明了。 下面来说下前面有人说到的“两个1000W个元素的数组,如何有效的找出他们的交集”,如果内存够大,当然好了,直接操作最好。如果元素的最小值是,1E呢?内存怎么办?如果是几个亿的元素呢? 看题来说,两个数组元素不太可能存在内存中,就假设存在文件一和文件二中吧。 给个简单思路,两个数组的数据存在文件一,文件二 定义A,B,C三个线程 X,Y两个数组,每个大小就拿10000个来说吧(决定大小的因素,计算机,语言等因素,这里不详细说了) A读文件一写入X数组写满A停止,B读取第二个文件写入Y数组写满B停止,这时候C启动,在X,Y两个数组找出交集,大小10000的两个数组怎么找交集这个大家自由发挥总之取到后写入另外个文件中,就当是文件三吧。 比较完后,清空Y,然后C停止,启动B接着读取写入Y,然后再启动C去重复上面的步骤,直到文件二完全操作完。 文件二操作完成后,再清空X再启动A,再重复上面的步骤,直到文件一全部操作完。 这个时候文件三就是结果了,记得别忘了去除重复元素。如果文件小,很好去除,如果文件依旧很大,那么还是按多线程的思路去解决。 取最大最小值的算法和取交集的算法本人不发表了,本人虽然是个程序员但是非数学,计算机专业,算法不敢和各位大虾去比,当然多线程和IO等其他操作中的问题,各自去解决吧,以上的思路觉得对的大家顶下,觉得不对的尽管提出,有更好思路的还望赐教。 MSN:flysunmicro@hotmail.com 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-16
如果是整数的话,我觉得先对两个文件内的数据先排序再处理
|
|
返回顶楼 | |
发表时间:2010-03-16
myhousepoor 写道 如果是整数的话,我觉得先对两个文件内的数据先排序再处理
具体什么算法快这个要实际种测试了。我提供的就是处理这样大文件,大数据的思路。 |
|
返回顶楼 | |
发表时间:2010-03-17
用hash求交集,参考oracle的做法
|
|
返回顶楼 | |
发表时间:2010-03-17
老实说,我看不到使用多线程的理由:
1>求最大最小数,两个线程不是并行的,没有必要,循环就可以搞定。 2>求两个集合的交集,LZ给出的方案效率太低,不如hash |
|
返回顶楼 | |
发表时间:2010-03-17
考算法的题,不要和多线程挨边
|
|
返回顶楼 | |
发表时间:2010-03-17
楼主,这种题会想到多线程真牛逼,先去看看计算机原理,看看cpu,内存是怎么工作的,再来谈多线程
|
|
返回顶楼 | |
发表时间:2010-03-17
最后修改:2010-03-17
要我就直接扔数据库里去,然后用数据库来搞定,
以前在现场都是这么搞的,数据库一个sql或者存储过程nohup搞下,导出到磁盘上的文件上去, |
|
返回顶楼 | |
发表时间:2010-03-17
顶, 思路很清晰.
我再补充一下hash的思路 两个数组的数据存在文件一,文件二 增加n个文件保存文件二的hash. n≈文件二中的数据量/下面数组的数据量 X数组,大小就拿10000个来说吧(决定大小的因素,计算机,语言等因素,这里不详细说了) 哈希结构Z. 读文件一写入X数组写满停止,读取第二个文件写入哈希Z. 在X,Z中找出交集.怎么找交集这个大家自由发挥总之取到后写入另外个文件中,就当是文件三吧。 保存Z到hash文件1. 比较完后,清空Z,接着读取写入Z,然后再重复上面的步骤,直到文件二完全操作完。这时得到了n个哈希文件了. 文件二操作完成后,再清空X,再重复上面的步骤.但是这时不是读取文件二了,直接读取n个哈希文件.直到文件一全部操作完。 这个时候文件三就是结果了,记得别忘了去除重复元素。如果文件小,很好去除,如果文件依旧很大,那么找楼主要多线程的算法。 |
|
返回顶楼 | |
发表时间:2010-03-17
flysunsystem 写道 面试遇到问大数据量的问题到底在考什么?这里讨论在程序中并非数据库中,也并不考虑借助数据库或者其他辅助工具。
他是考验你算法?会不会遍历?集合的使用?还是考验计算机内存大小的?我感觉都不是,是在考你思路。前面有人发表了“两个1000W个元素的数组,如何有效的找出他们的交集”,等会我说下思路,对的话大家顶下,谢谢。 先说我以前我也遇到过一道类似的题,4G大小的文件,里面全部是整数,求出最大,最小值。别告诉我拿8G内存的计算机用数组存储,然后遍历,比较。。。如果人家说8G的文件呢?16G的文件呢?当时我第一反应是把4G文件分开,但是后来马上想到的是多线程,最后说出了思路,描述如下: A,B两个线程 定义两个变量int max,min; 一个int数组,大小任意(决定大小的因素,计算机,语言等因素,这里不详细说了),例如大小10000的数组X A读取文件写入X,写满A暂停,B启动在数组X种找到最大最小分别赋值给变量max,min 遍历完后清空X,暂停B,然后启动A同样是读取文件,写入数组,之后暂停A,遍历和max,min比较,遍历完最大和最小值分别赋值给变量max和min 重复操作,直到全部读取比较完,结束。 这只是个思路,其中多线程的操作和IO等操作不做详细说明了。 下面来说下前面有人说到的“两个1000W个元素的数组,如何有效的找出他们的交集”,如果内存够大,当然好了,直接操作最好。如果元素的最小值是,1E呢?内存怎么办?如果是几个亿的元素呢? 看题来说,两个数组元素不太可能存在内存中,就假设存在文件一和文件二中吧。 给个简单思路,两个数组的数据存在文件一,文件二 定义A,B,C三个线程 X,Y两个数组,每个大小就拿10000个来说吧(决定大小的因素,计算机,语言等因素,这里不详细说了) A读文件一写入X数组写满A停止,B读取第二个文件写入Y数组写满B停止,这时候C启动,在X,Y两个数组找出交集,大小10000的两个数组怎么找交集这个大家自由发挥总之取到后写入另外个文件中,就当是文件三吧。 比较完后,清空Y,然后C停止,启动B接着读取写入Y,然后再启动C去重复上面的步骤,直到文件二完全操作完。 文件二操作完成后,再清空X再启动A,再重复上面的步骤,直到文件一全部操作完。 这个时候文件三就是结果了,记得别忘了去除重复元素。如果文件小,很好去除,如果文件依旧很大,那么还是按多线程的思路去解决。 取最大最小值的算法和取交集的算法本人不发表了,本人虽然是个程序员但是非数学,计算机专业,算法不敢和各位大虾去比,当然多线程和IO等其他操作中的问题,各自去解决吧,以上的思路觉得对的大家顶下,觉得不对的尽管提出,有更好思路的还望赐教。 MSN:flysunmicro@hotmail.com 数据结构和算法 与线程无关 |
|
返回顶楼 | |