给算法牛人出一道题

EnForGrass 2012-05-25 01:17:50
加精
RT,我是来学习学习

题目:

文件中有10亿个整数,分成n段,n未知,每段里面数的个数在1到100之间,段里面的数是无序的,但前一段的数都比后一段小,段与段之间的界限未知,请选择效率最高的排序算法,并说服时间空间复杂度
...全文
12166 203 打赏 收藏 转发到动态 举报
写回复
用AI写文章
203 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujk 2013-09-29
  • 打赏
  • 举报
回复
这种算法就用冒泡即可。冒泡的弱点是大跨度的数据交换,如:当前的数据下标是50,找到的位置是5000,那么会把4050个数移动一格,然后在空出的这个位置插入。这就很慢。而现在的环境是最多100个数无序。因此查找和插入之前的移动数量不太会大。
大尾巴猫 2013-08-14
  • 打赏
  • 举报
回复
很简单。 首先要注意是对文件内的大规模数据排序,那么IO的效率是最先考虑的,每个数据以读1次写1次为最基本的要求。#116的方法不行,多次读写文件,显然很慢。 我的解题方法: 每次读1千万或者1亿的数据到内存,排序(先不考虑用何种排序,后面再讨论这个内排序选择什么方法),然后截取尾部的100个数据,前面绝大多数数据写入一个文件。写入新文件的数据肯定比还在旧文件内的数据都要小。然后把剩下的100个数据移动到数组头部,接下来把文件中的数据读出来,填满这个数组,排序,留最后100,前面的写入文件...如此循环,直到所有数据写到新文件。 这个题目就这样由外排序转为内排序了。至于内排序,基数、快速或者归并都行。 对这样特殊的数据序列,不大于100个各数据段,段和段是有序的,直接插入排序也是可以的。 快速排序优化的一个方法,是大段数据分区后,对小区间使用直接插入排序优化的。而这个题目类似。跟据我自己的经验,用现在的电脑对快速排序优化的插入排序的小区间的数值是128左右。(自己编写快排,多组数据测试的结果) 所以这个内排序可以直接用插入排序做。 有的时候不能以空间复杂度完全替代实际的运行时间,要考虑算法内循环的开销,判断的开销,以及cpu高速缓存对读取数据的命中率。要不然,也不会有小数据区间用直接插入排序去优化快速排序这么一说了。
xuqining 2013-04-27
  • 打赏
  • 举报
回复
虽然不懂算法,不过学习了
希德小子 2012-11-14
  • 打赏
  • 举报
回复
回答的很好呢,只是题目没看明白。。
magic911911 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 196 楼 的回复:]

真心求指导,我这样做有什么不妥? 前面的各种解答IO操作有更少吗?
取100K个数字放到内存排序,然后把前1~(100K-100)个排好的写入文件
再从100k-99 开始取100k个重复此动作,把前(100k-100)个数字append到前面的文件.

这样总共做了 10亿/100k 次 也即1万次
总共复杂度是1亿*(log100K)

这里100k取决于内存大小,可以加大.加……
[/Quote]

貌似跟6楼一样. 每100k个在内存里排序不需要 100k*log(100k), 像6楼那样100k*log(200)就可以了.最后是10亿*log(200)
magic911911 2012-10-30
  • 打赏
  • 举报
回复
真心求指导,我这样做有什么不妥? 前面的各种解答IO操作有更少吗?
取100K个数字放到内存排序,然后把前1~(100K-100)个排好的写入文件
再从100k-99 开始取100k个重复此动作,把前(100k-100)个数字append到前面的文件.

这样总共做了 10亿/100k 次 也即1万次
总共复杂度是1亿*(log100K)

这里100k取决于内存大小,可以加大.加大后IO读写更小.
h_w_m 2012-10-30
  • 打赏
  • 举报
回复
刚才没看题目,汗,我不是牛人,甚至都不是班科出生,农大的动科院出来的,自学计算机,只是有些爱好,算法什么的不懂,即使在用它我也不记它是什么名称,复杂度什么的也不会评估,不学无术,在这乱说了,
我觉得对于这种相对比较有序的特殊情况,最多100次冒泡就完事了, 不能全读入内存则如上楼所说,每回有100个数据重复参与冒泡,内存缓冲区稍开大一点,重复参与的比率就足够小可以忽略了
h_w_m 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 196 楼 的回复:]

真心求指导,我这样做有什么不妥? 前面的各种解答IO操作有更少吗?
取100K个数字放到内存排序,然后把前1~(100K-100)个排好的写入文件
再从100k-99 开始取100k个重复此动作,把前(100k-100)个数字append到前面的文件.

这样总共做了 10亿/100k 次 也即1万次
总共复杂度是1亿*(log100K)

这里100k取决于内存大小,可以加大.加……
[/Quote]
我赞同这个想法,我也如此想的,且内存中的数据直接用不完全冒泡法,冒100次就OK了,哪里用得着分什么段

zjh_c_s_d_n 2012-06-28
  • 打赏
  • 举报
回复
不太懂的飘过。。。
spider0502 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 193 楼 的回复:]

也不知道你们都算了时间复杂度了没,竟然认为116楼的最好。

8楼和10楼的时间复杂度都是O(n),10楼没仔细算,系数貌似小一些。
116楼,每一次合并排序,时间复杂度都是O(n),一共要做O(lgn)次,总的复杂度是O(nlgn),显然不够好。

还有150楼,我不明白,直接做一次冒泡排序不就行了吗。两边分别冒泡,啥意思?相当于对每一个段做了冒泡排序,排完后整个数组就是有序的了,时……
[/Quote]
把冒泡想成插入排序了。。。是直接插入排序就可以了,时间复杂度是O(n)。
spider0502 2012-06-28
  • 打赏
  • 举报
回复
也不知道你们都算了时间复杂度了没,竟然认为116楼的最好。

8楼和10楼的时间复杂度都是O(n),10楼没仔细算,系数貌似小一些。
116楼,每一次合并排序,时间复杂度都是O(n),一共要做O(lgn)次,总的复杂度是O(nlgn),显然不够好。

还有150楼,我不明白,直接做一次冒泡排序不就行了吗。两边分别冒泡,啥意思?相当于对每一个段做了冒泡排序,排完后整个数组就是有序的了,时间复杂度也是O(n)。
chaojizhiduoxing 2012-06-12
  • 打赏
  • 举报
回复
楼主的题目我感觉就有点别扭:
数据居然是一段 一段的 那么我可不可以这样理解123 456 789 ....... 连续的数据还需要分离,这怎么分?
商科程序员 2012-06-10
  • 打赏
  • 举报
回复
[Quote=引用 188 楼 的回复:]
引用 6 楼 的回复:
每200个排序。然后交错着每200个排序。每一块必定在至少一次排序中被完全排序。已经排序的块不会被改动。所以可以到nlogm,n是10亿,m是100。
题目是十亿个数,不是十亿组数,所以时间复杂度是1000万*log2(100)
[/Quote]我错了,是1000万 * 100 * log2(100)
我自己想的算法还是复杂了。
商科程序员 2012-06-10
  • 打赏
  • 举报
回复
把数据分成1000万组,每组100个排好序。例如g0, g1 ... g10000000.
然后把相临的组合并,方法为把gn+1组比gn最大的数小的数找出来为,然后相继插入到gn中。插入中使用二分查找方式插入,插入后记录位置gn[i],下一次插入是只需从gn[i]到g[100+1]二分查找插入,每个数都按这个方法插入。

时间复杂度最坏为1000万*log2(100) + 1000万*log2(200)
最好的时间复杂度为1000万*log2(100)
平均为1500万*log2(100)
zjqmyron 2012-06-10
  • 打赏
  • 举报
回复
好题,学习学习。
商科程序员 2012-06-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
每200个排序。然后交错着每200个排序。每一块必定在至少一次排序中被完全排序。已经排序的块不会被改动。所以可以到nlogm,n是10亿,m是100。
[/Quote]题目是十亿个数,不是十亿组数,所以时间复杂度是1000万*log2(100)
menger44 2012-06-08
  • 打赏
  • 举报
回复
早还给大学老师了 算法 忘记了
wentianwu 2012-06-08
  • 打赏
  • 举报
回复
算法有那么重要吗
meng88lin 2012-06-08
  • 打赏
  • 举报
回复
女生上了年纪 脑袋不好使啊,怎么看不懂呢
artwc 2012-06-08
  • 打赏
  • 举报
回复
1.先分成a,b两个数组, a负数一段(在判断负数同时将其绝对值设为数级索引), b是0和正数一段并也将值和索引一一对应;
结果:a[1]=-1;a[34]=-34;a[5]=null; b[0] = null;b[34]=34;
至此就可以直接用索引取到最大或最小数.

按for < 100循环,最到空值跳过,正好附合每段个数不同的逻辑

时间 10亿*2;

本人只懂js,没有科班教育,说错了请多多指正.
加载更多回复(134)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧