麻省的一道算法题目

sdnd2000 2008-04-14 09:17:59
一道算法题目,我翻译了一下
S1,S2,..Sk是一些整数序列, n是所有序列中元素的总和.所有元素值的范围在1到n之间。 其中,Si包含了ni个元素(注:i是下标).每一个序列的元素个数不是一个常量,因此,序列的个数K也不是常量,也许是O(n).我们要为每一个序列排序,使每个序列都是有序的。

a. 如果我们用桶排法对每个序列排序,那么总的时间复杂度是什么,用K和n表示。

我觉得应该是O(kn),因为桶排序的时间复杂度o(n).


b.设计一个更简洁的算法完成排序。
c.用你设计的算法对一下序列进行排序。K=3,n=8
S1= (8,5,7), S2=(6,5,8), S3=(5,3)

第二问是该用基数排序吗?
希望大家看看啊,谢谢了。
...全文
233 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
用一个结构记录每个元素原先位于那个set里,最后哪来的回哪去,当然可以了。
回复
sdnd2000 2008-04-16
题目要求是最后每一个set里的元素是有序的,如果是用基数排序,只能拆散了,最后怎样又分成sets呢?个人认为应该用归并排序对每个set进行排序.
回复
从原题来看,似乎是对每个序列进行排序就可以了,最后不用合并在一起。题目里特别提到了每个集合中的元素数量可能很多也可能很少,也许是想提醒我们考虑算法效率。

如果第一题就用到了桶排序,那第二题我也只能想到计数或者基数排序了。
所有元素的取值范围都在1~n,这样可以将所有集合中的元素放在一个大的数组结构里进行计数,并标记清楚每个数的来自那个集合。最后一步出来计数的时候还把它们塞回原来集合当中。这样做相比第一题而言有两个优点:
1.桶排序在元素均匀分布的条件下才能达到线性时间复杂度,而计数排序则不要求这一点;
2.所有元素合在一起排序,最后才拆开。避免了对每一个小集合都进行排序而带来的空间/时间上的浪费。
回复
sdnd2000 2008-04-15
顶一下,
回复
从举的例子来看,n应该是指所有序列中元素个数的总和。

不过题目的要求是指对每个序列完成排序就ok了,还是最后要把所有的序列合在一个排好的序列里?
从楼主的翻译看像是前者,不过我猜后者更靠谱一些,不然排序1个序列和排序10个都是一样的办法,没必要整这么多序列出来。

如果是后者,前面对每个序列单独排序的过程可以用桶排序,(假设元素均匀分布的话)这一步的复杂度是O(n);后面合并K个序列可以采用归并的方法,复杂度是O(n*lgk)。因此整体复杂度为O(n*lgk)
回复
fire_woods 2008-04-14
n是所有序列中元素的总和,是元素个数的总和,还是元素数值的总和?
回复
sdnd2000 2008-04-14
应该是分开排序而不是合在一起排序吧
回复
sdnd2000 2008-04-14
谢谢大家,我把原文贴出来了,大家看看吧

Let S1,S2,... Sk be sets of integers, where n is the total number of elements in all sets combined, and all integers have valus in therange 1 to n. Let ni(ni表示n1,n2...) be the number of elements in set Si. The number of elements in each set may vary from only a few to very many. Thus, the number of sets, k, is not constant may be O(n). We want to sort the elements in each set, so that at the end, each set Si will have ite own original elements but in sorted order.

a) Suppose we apply bucket-sort to each set separately. What is the total time complexity of the algorithm(in terms of k and n) Explain.

b) Outline a more efficient algorithm to perform the entire job. and analyze the time complexity.

c)Illustrate the improved algorithm on the following example, where k=3 and n=8
S1= (8,5,7), S2=(6,5,8), S3=(5,3)
那么第二题怎么做呢?
回复
volant_hoo 2008-04-14
箱排序,一次装箱,一次拆箱应该就可以了吧?!
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-04-14 09:17
社区公告
暂无公告