首页 > 试题广场 >

海量数据分布在100台电脑中,想个办法高效统计出所有数据的前

[问答题]

海量数据分布在100台电脑中,想个办法高效统计出所有数据的前10个最大关键字数据,并分析时间复杂度。

答;先分别求出每台电脑的前10个最大关键字数据,再根据这100台电脑的最大前10个关键字电脑,共1000个数据求出前10个最大关键字即可。具体分析如下:

(1) 先求出每台电脑的前10个最大数据。由于只需要求出部分数据,因此不需要对n个数据全部排序,采用部分排序算法即可,比如简单选择排序,堆排序,桶排序。

(2) 求n个数据的前k(这里k=10)大数据,当k<<n时,最佳的方法是将后面的n-k个数据依次与前面的k个数据的最小值比较,如果比最小值还小,则扔掉该数据,继续比较下一个数据,否则扔掉更小的数据,把这个数据加入,直到余下的n-k个数据都处理完。由于每次需要与存储的k个数据比较并可能删除最小元素,加入新的元素,最好的结构是小顶堆。即将前k个元素调整为小顶堆(时间复杂度为O(klogk))余下元素依次与小顶堆根结点比较,比根节点小则扔掉,比根节点大则用当前值替换根结点,并调整为小顶堆,时间复杂度为O(logk)。所以总的最坏时间复杂度为

O(klogk)+O((n-k)logk)=O(nlogk)

(3) 再从m(这里m=100)台电脑的共km(这里km=1000)个数据中选择所有数据的最大k个,采用(1)类似的方法即可求出。即将一台电脑的小顶堆作为初始小顶堆,余下m-1台电脑的最大k个元素依次与小顶堆的根结点元素比较,大于根结点则替换根结点元素并调整为小顶堆,直到余下的数据都处理完成,时间复杂度为O((m-1)klogk)          
(4) 综合上面3步,最终选择小顶堆能够最快统计出所有数据的前k(k=10)个最大关键字数据,总的最坏时间复杂度为

O(nlogk)+O((m-1)klogk)=O((n+mk)logk)  如果k<<km<<n 则T(n)=O(n)             

发表于 2016-11-23 23:47:30 回复(1)