首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

几道算法有关问题

2012-10-05 
求助几道算法问题有些符号打不出来,留下邮箱详谈2.考虑用以下算法排序N个元素:把每个元素放入自己的列表中

求助几道算法问题
有些符号打不出来,留下邮箱详谈

2.考虑用以下算法排序N个元素:把每个元素放入自己的列表中。然后反复执行下面的步骤N-1次:选择2个表,然后合并他们。注意每次合并把列表数量减少到1,但是保留了排好序的所有列表。所有到了最后,留下的就是一个由N个元素排好序列的表。
A.假设初始N列表放在了一个栈上,然后在任何时候,都是前2个列表被选中合并,结果被放在栈顶,那这个排序算法的运行时间是多少?
B.假设初始N列表放在队列中。爱人和时候,都是前2个列表被选中合并,结果被放在队列最后,那这个排序算法的运行时间是多少?

3.假设我们想要分配N个物品为G个相等大小的群,大小N/G。最小的N/G物品在1群里面,第二小的N/G物品哎2群,以此类推。群本身不需要排序。为了简单,你可以假设N和G是2的乘方,给出一个O(N log G)算法解出这个问题。
4.假设 K 是一个大于等于2的常数。
证明合并由N个数组成的K个已排序数组需要至少K N-1次比较。或者提供一个用了少于KN-1次比较的算法证明这个声明是错的。


[解决办法]
2. 这个要倒过来看. 
①T(n) = T(n - 1) + O(n)
②T(n) = 2T(n / 2) + O(n)

3. 我的想法是首先选出G个群的首元素, 使用类快排方式获取序号元素(算法复杂度为(lgN)), 则此步骤为G*lgN. 
剩下的就是使用二分查找确定其具体属于哪个群, 算法为N * lgG. 
综合: G*lgN + N*lgG. 
而G*lgN = O(N*lgG) 当G=O(N)时. 

4. 错误. 事实上有O(N*lgK)的算法. 
算法的核心在于如果从K个数组中的首元素中选取最小的一个, 一般方法需要k - 1次比较找出最小值. 如果使用堆来管理最小的K个元素, 则每次取出最小的只需一次, 然后将最小的下一个添加进堆中, 需要lgK次. 综述: 
约为N*lgK.

热点排行