有20个数组,每个数组有500个元素,升序排列,现在在这20*500个数中找出排名前500的数。求时间复杂度?
2017-10-25 19:28
369 查看
有20个数组,每个数组有500个元素,升序排列,现在在这20*500个数中找出排名前500的数。求时间复杂度?
注意:调堆的时间复杂度为logN, 建堆的时间复杂度是O(N)。
-
直接暴力求解,将20个数组合并,然后排序,取出500个数
-
使用归并。 对于排好序的 序列,我们要注意使用归并。
先将第1个和第2个归并,得到500个数据(注意,我们不是归并得到100个数)。然后再加结果和第3个归并,得到500个数据,再与第4个归并,等等。 -
网上的方法,就是堆。保持一个20的堆,然后先将每个数组的第1个数入堆。
20个元素的堆一直保持容量为20个,20个数组的最小元素可以将20个数组的第0个元素入堆,最小堆的性质,顶点为最小值。这时候得到了500个结果里的第0个结果。然后再把下一个元素入20个元素的堆,堆插入的时候会保持性质不变,最小元素依然在顶点。再取出20个元素的顶点,得到500个结果里的第1个结果。
假设 [1,3,4,5,6] [2,3,4,5,6] [3,4,5,6,7]
最小的是比较 1 2 3 得到1
第2小的是将刚才的1替换为后面的元素3 再加上刚才的元素2 3,得到2注意这儿需要保持数来自于哪个数组,以及其在数组里的位置
// 方法3,保持一个最小堆,这个堆存放来自20个数组的最小数 // 建立堆的时间复杂度为O(20), // 每次取出一个数,然后将该数所在的数组的后面一个数入堆 // 重复上面步骤,取出500个数 // 注意建堆的时候需要保持 数来自哪个数组,用一个内部类实现 // 复杂度是 O(20)+500 * log(20) Integer[] result3 = new Integer[500]; MinHeap<DataWithSource> heap = new MinHeap<DataWithSource>(); for (int i = 0; i < rowSize; i++) { // 记录下来源那个数组,以及在数组中的 index DataWithSource d = new DataWithSource(data[i][0], i, 0); heap.add(d); } int num = 0; while (num < columnSize) { // 删除顶点元素 DataWithSource d = heap.removeTop(); result3[num++] = d.getValue(); // 将 value 置为该数原数组里的下一个数 d.setValue(data[d.getComeFrom()][d.getIndex() + 1]); // 将其在数组中的 index +1 d.setIndex(d.getIndex() + 1); heap.add(d); }
相关文章推荐
- 有20个数组,每个数组有500个元素,升序排列,现在在这20*500个数中找出排名前500的数。
- 一道面试题 有20个数组,每个有500个元素,升序排列,找出前500的数
- 随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,如果
- 找出大数组array中第k大的元素(要求时间复杂度O(1))
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- C语随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,
- 编写程序实现以下功能: 随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条
- 找出和值等于指定值的元素,如有序数组{1,2,6,23,43,64},求和等于25的两个和数则将是元素2和23,时间复杂度是0(n)。
- 随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,如果
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 假定有20个 有序 数组,每个数组有500个数字,数字类型32位uint数值,现在需要取出这10000个数字中最大的500个,怎么做?
- 20个排序好的数组,每个数组500个数,按照降序排序好的,让找出500个最大的数。
- 随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,如果
- 随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,如果
- 20个排序好的数组,每个数组500个数,按照降序排序好的,让找出500个最大的数。
- 有20个数组,每个数组里面有500个数字,降序排列,每个数字是32位的int,求出这10000个数字中最大的500个。
- 给定整型数组,其中每个元素表示木板的高度,木板的宽度都相同,求这些木板拼出的最大矩形的面积。并分析时间复杂度。
- Java实现升序排列的整形数组A,元素两两不相等找出A[i]=i的数据
- 给定整型数组,其中每个元素表示木板的高度,木板的宽度都相同,求这些木板拼出的最大矩形的面积。并分析时间复杂度。
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素