海量数据分布在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)
O(nlogk)+O((m-1)klogk)=O((n+mk)logk) 如果k<<km<<n 则T(n)=O(n)