由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - merge k个数组怎样的方法好?
相关主题
问一个merge k sorted array的问题Amazon 面试题
divide array into two, sum of difference is min in O(N)一个特别的inplace merge two sorted arrays
a[i] + b[j] = c[k] 的题有靠谱的答案不?再问一个算法题。
问个算法题8求教 合并两数组 并排除重复
求一下这题解法。amazon tel interview
LinkIn面经请问一个老的google题
amazon问题求教请教一道题
请教一个题目Median of Two Sorted Arrays
相关话题的讨论汇总
话题: int话题: pair话题: array话题: pos话题: complexity
进入JobHunting版参与讨论
1 (共1页)
f**********t
发帖数: 1001
1
一种是每次两两merge,变成k/2个,k/4个,。。。最终变为1个。
还有更好的方法没?非常感谢 :)
a*********0
发帖数: 2727
2
n-way merge

【在 f**********t 的大作中提到】
: 一种是每次两两merge,变成k/2个,k/4个,。。。最终变为1个。
: 还有更好的方法没?非常感谢 :)

f**********t
发帖数: 1001
3
有链接么?搜索感觉有很多个版本也
f**********t
发帖数: 1001
4
有没有更好的做法?
Brute force method:
sort the array using any existed sort algorithm, just treating the array as
normal array. The best time complexity is O(nlogn)
Method2:
Among M sorted array, select the smallest number from one array, move the
pointer to the next integer of the array. repeat this routine, until all
integers are put into order.
For each integer in the output array, it's compared M times. the time
complexity is O(n*M)
The code is listed below:
void nwaymergesort(int* arr, int* out, int M,int n)
{
//record the current position for each sorted array
int *pos = new int[M];
//initialize position
for(int i=0;i pos[i]=i;
for(int j=0;j int min = -1;
int k = -1;
for(int i=0;i if(pos[i] we should jump this array
if(min == -1 || arr[pos[i]] min = arr[pos[i]];
k = i;
}
}
}
out[j]=min;
pos[k]+=M;
}
}
h**********d
发帖数: 4313
5
用heap

【在 f**********t 的大作中提到】
: 有没有更好的做法?
: Brute force method:
: sort the array using any existed sort algorithm, just treating the array as
: normal array. The best time complexity is O(nlogn)
: Method2:
: Among M sorted array, select the smallest number from one array, move the
: pointer to the next integer of the array. repeat this routine, until all
: integers are put into order.
: For each integer in the output array, it's compared M times. the time
: complexity is O(n*M)

f**********t
发帖数: 1001
6
嗯,heap确实比上面的method 2好。

【在 h**********d 的大作中提到】
: 用heap
s********v
发帖数: 288
7
sort k个
然后k个一起排序:)

【在 f**********t 的大作中提到】
: 一种是每次两两merge,变成k/2个,k/4个,。。。最终变为1个。
: 还有更好的方法没?非常感谢 :)

a*********0
发帖数: 2727
8
it's still n-way merge with the aid of min-heap. O(nlogk)complexity

【在 f**********t 的大作中提到】
: 嗯,heap确实比上面的method 2好。
f**********t
发帖数: 1001
9
对。
Min-heap O(nlogk)
method 2那个O(nk)

【在 a*********0 的大作中提到】
: it's still n-way merge with the aid of min-heap. O(nlogk)complexity
f**********t
发帖数: 1001
10
这里假设k个数组已经有序

【在 s********v 的大作中提到】
: sort k个
: 然后k个一起排序:)

h**********d
发帖数: 4313
11
I think it's O(nklogk) :)

【在 a*********0 的大作中提到】
: it's still n-way merge with the aid of min-heap. O(nlogk)complexity
n*******n
发帖数: 3
12
我来试着证明一下本题的时间复杂度是有下限的。而且下限是 O(nlogk), n为所有
integer的个数. 证明如下:
一般常识是sort n个integer最快是O(nlogn). 所以把n个integer分成k组,每组分别
sort,再合起来,不可能比O(nlogn)更快。 n = k * m
分别sort k 个 size 为 m的数组共需时间 k * O(mlogm) = O(nlogm). 所以merge k个
数组的时间不可能小于 O(nlogn)- O(nlogm) = O(nlog(n/m)) = O(nlogk) .
楼上各位已经找到最优解了。
i**********e
发帖数: 1145
13
Time complexity: O(N log k), N = total elements of all arrays, k = total
number of arrays.
Space complexity: O(k), to record the indices of each array.
Tips: Use a vector of vectors instead of 2d arrays to reduce coding complexity :)
typedef pair Pair;
vector mergeKSortedArrays(vector > A) {
int k = A.size();
priority_queue, greater > q;
vector ret;
int *index = new int[k];

for (int i = 0; i < k; i++) {
q.push(Pair(A[i][0], i));
index[i] = 1;
}
while (!q.empty()) {
Pair p = q.top();
q.pop();
ret.push_back(p.first);
if (index[p.second] < A[p.second].size()) {
q.push(Pair(A[p.second][index[p.second]], p.second));
index[p.second]++;
}
}
delete[] index;
return ret;
}
b*******8
发帖数: 37364
14
CRLS后习题讨论过这个。如果独立想出来的,还是很牛啊。

【在 n*******n 的大作中提到】
: 我来试着证明一下本题的时间复杂度是有下限的。而且下限是 O(nlogk), n为所有
: integer的个数. 证明如下:
: 一般常识是sort n个integer最快是O(nlogn). 所以把n个integer分成k组,每组分别
: sort,再合起来,不可能比O(nlogn)更快。 n = k * m
: 分别sort k 个 size 为 m的数组共需时间 k * O(mlogm) = O(nlogm). 所以merge k个
: 数组的时间不可能小于 O(nlogn)- O(nlogm) = O(nlog(n/m)) = O(nlogk) .
: 楼上各位已经找到最优解了。

1 (共1页)
进入JobHunting版参与讨论
相关主题
Median of Two Sorted Arrays求一下这题解法。
问一个我onsite的题LinkIn面经
出个题,求每个pair的hamming distanceamazon问题求教
面试题请教一个题目
问一个merge k sorted array的问题Amazon 面试题
divide array into two, sum of difference is min in O(N)一个特别的inplace merge two sorted arrays
a[i] + b[j] = c[k] 的题有靠谱的答案不?再问一个算法题。
问个算法题8求教 合并两数组 并排除重复
相关话题的讨论汇总
话题: int话题: pair话题: array话题: pos话题: complexity