由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - [Algo]dutch flag problem
相关主题
荷兰国旗问题的扩展问一道题
问个dutch flag顶风上来问道题:一个很大char[], 如何in-place 删除重复元素
大家看看这几道google面试题怎么做?问道排序题
问个google面试题比较两个QuickSort函数
一道面试题讨论一道老题:分离数组中的正负数 (转载)
One Amazon question分享今天做的一道基础题
~~~~~~~~问个G家的题~~~~~~~~~~~quicksort到底以哪个为准啊
Re: 贡献个facebook电话interview关于quicksort的两种实现方法
相关话题的讨论汇总
话题: mid话题: int话题: data话题: swap话题: dutch
进入JobHunting版参与讨论
1 (共1页)
d********w
发帖数: 363
1
简单型:sort 0, 1数组, O(n)时间,可以使用头尾两个pointer,
i = 0;
j = n-1;
while( i < j){
while( array[i] == 0 && i < j )
i++;
while( array[j] == 1 && j > i )
j--;
if ( i < j )
swap( a[i], a[j] );
}
如果是排序0,1,2数组,就是dutch flag问题, http://en.wikipedia.org/wiki/Dutch_national_flag_problem,跟quicksort中的partition类似
void threeWayPartition(int data[], int size, int low, int high) {
int p = -1;
int q = size;
for (int i = 0; i < q;) {
if (data[i] < low) {
swap(data[i], data[++p]);
++i;
} else if (data[i] >= high) {
swap(data[i], data[--q]);
} else {
++i;
}
}
}
扩展问题
1)如果是n个数字呢,基数排序
2)如果要保证in order呢?
3)让0,1相间排列,如果多余0或1就放在尾部,保证O(n)时间,不使用辅助空间,
i.e.
input: 0 1 1 1 0 0 1 1 1 0
output: 0 1 0 1 0 1 0 1 1 1
d********w
发帖数: 363
2
扩展3,找到一个这么写的,http://pastebin.com/f41fe39d1
大家看看对不

【在 d********w 的大作中提到】
: 简单型:sort 0, 1数组, O(n)时间,可以使用头尾两个pointer,
: i = 0;
: j = n-1;
: while( i < j){
: while( array[i] == 0 && i < j )
: i++;
: while( array[j] == 1 && j > i )
: j--;
: if ( i < j )
: swap( a[i], a[j] );

d********w
发帖数: 363
3
扩展3如果能计数的话,就简单了,只要把1的个数,0的个数统计出来,就知道最后留
几个,前面就直接按01打印了,如果限定不能计数呢
还想到一个问题,如果是求最少的交换次数,例如三色问题,不一定要求0放在最前,
只是相同数字聚在一起。01间隔打印的话,不一定0101,1010也行。该怎么思考呢

【在 d********w 的大作中提到】
: 扩展3,找到一个这么写的,http://pastebin.com/f41fe39d1
: 大家看看对不

i**********e
发帖数: 1145
4
这道题 FB 面试有人贴过,而且听说代码写起来很麻烦.
在网上尝试找关于 Dutch National Flag Problem (DNFP) 的扩展至 k 种颜色的解法
,找了老半天都没找着(连四种颜色的也没找到),代码只好自己写了.
今天写 DNFP 四种颜色排序基本写对了,但是某些 test cases 不能通过。主要难度在
于当此颜色为第一颜色的时候应该怎么交换。研究了老半天,终于开窍了。原来是忘掉
了一个很重要不变量(invariant),就是 0 <= r <= w <= b < n (这里指的是原题
的三种颜色,r=red, g=green, b=blue,扩展至 k 种颜色的不变量为 0 <= mid[0] <=
mid[1] <= ... <= mid[k-1] < n).
DNFP 四种颜色写对了之后,思路就清晰了,非常容易扩展至 k 种颜色。利用一个内循
环,来保持不变量 0 <= mid[0] <= mid[1] <= ... <= mid[k-1] < n. 这内循环似乎
很耗时,但少了这内循环,我又不知道怎样才能保持以上的不变量,望高手指教.
顺便介绍一个写得很好关于 DNFP 的文章,受益匪浅.
http://www.iis.sinica.edu.tw/~scm/ncs/2010/10/dutch-national-fl
还有另外一段文章,有模拟 DNFP 的运行,写得也不错。但是不完全对,其文章根本就没提到很重要的不变量,也就是 0 <= r <= w <= b < n.
http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Flag/
以下是我写的代码,欢迎大家讨论.
// Dutch National Flag Problem (DNFP) generalized to k different
colors.
// k = {0, 1, 2, ..., k-1}
// pre-condition: n >= 0, k >= 2
void SortK(int A[], int n, int k) {
assert(n >= 0 && k >= 2);
int *mid = new int[k];
// init values to satisfy invariant below
for (int i = 0; i < k-1; i++)
mid[i] = 0;
mid[k-1] = n-1;
// invariant:
// 0 <= mid[0] <= mid[1] <= mid[2] <= ... <= mid[k-1] < n,
// A[0..mid[0]-1] = 0,
// A[mid[0]..mid[1]-1] = 1,
// A[mid[1]..mid[2]-1] = 2,
// ...
// A[mid[k-2]..mid[k-1]] = mixed colors,
// A[mid[k-1]+1..n-1] = k-1.
// the range of mixed colors is: [ mid[k-2] ... mid[k-1] ]
// the array is sorted when mid[k-2] > mid[k-1] (ie, no more mixed colors)
while (mid[k-2] <= mid[k-1]) {
if (A[mid[k-2]] == k-1) {
swap(A[mid[k-2]], A[mid[k-1]]);
mid[k-1]--;
} else if (A[mid[k-2]] == k-2) {
mid[k-2]++; // no swap needed, advance
} else {
int x = A[mid[k-2]];
swap(A[mid[k-2]], A[mid[x]]);
mid[x]++;
// for maintaining invariant: (mid[x+1], mid[x+2] ... mid[k-2]) >= mid[x]
for (int i = x+1; i <= k-2; i++)
if (mid[i] < mid[x])
mid[i] = mid[x];
}
}
delete[] mid;
}
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
j********x
发帖数: 2330
5
2, O(n) space radix sort is stable
3, "no extra memory" is ill-defined, is index considered "extra"?
g*********s
发帖数: 1782
6
i think O(1) space is fine.

【在 j********x 的大作中提到】
: 2, O(n) space radix sort is stable
: 3, "no extra memory" is ill-defined, is index considered "extra"?

1 (共1页)
进入JobHunting版参与讨论
相关主题
关于quicksort的两种实现方法一道面试题
上面经,又被死老印黑了!One Amazon question
Quick Sort的partition问题~~~~~~~~问个G家的题~~~~~~~~~~~
找出这个Dutch Flag解法的bug?Re: 贡献个facebook电话interview
荷兰国旗问题的扩展问一道题
问个dutch flag顶风上来问道题:一个很大char[], 如何in-place 删除重复元素
大家看看这几道google面试题怎么做?问道排序题
问个google面试题比较两个QuickSort函数
相关话题的讨论汇总
话题: mid话题: int话题: data话题: swap话题: dutch